这个答案表明,可以将所有文件(包括隐藏文件)从目录复制src
到目录中dest
,如下所示:
mkdir dest
cp -r src/. dest
答案或其评论中没有解释为什么这实际上有效,而且似乎也没有人找到这方面的文档。
我尝试了一些东西。一、正常情况:
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src dest
$ ls -A dest
dest_file src
然后,/.
最后:
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/. dest
$ ls -A dest
dest_file .dotfile src_dir src_file
因此,它的行为类似于*
,但也会复制隐藏文件。
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/* dest
$ ls -A dest
dest_file src_dir src_file
.
并且是此处解释..
的正确硬链接,就像目录条目本身一样。
这种行为是从哪里来的,它记录在哪里?
该行为是记录在案的算法的逻辑结果
cp -R
。参见POSIX,步骤 2f:.
和..
是目录,分别是当前目录和父目录。就外壳而言,两者都不是特殊的,因此扩展也不关心,并且目录将被复制,包括隐藏文件。*
,另一方面,将扩展为文件列表,这是隐藏文件被过滤掉的地方。src/.
是里面的当前目录src
,也就是src
它本身;src/src_dir/..
是src_dir
的父目录,又是src
. 所以从外面看src
,如果src
是一个目录,指定src/.
或src/src_dir/..
作为源文件cp
是等价的,并且复制其中的内容src
,包括隐藏文件。指定的要点
src/.
是,如果src
不是目录(或目录的符号链接),它将失败,而src
不会。它也只会复制的内容src
,而不复制src
自己;这也符合文档:所以
cp -R src/. dest
复制src
to的内容dest/.
(源文件.
在src
),而cp -R src dest
复制src
to的内容dest/src
(源文件在src
)。另一种思考方式是比较复制
src/src_dir
andsrc/.
,而不是比较src/.
andsrc
。.
行为就像src_dir
前一种情况一样。当你跑的时候
cp -R src/foo dest
,你会得到dest/foo
。因此,如果目录dest/foo
不存在,cp
将创建它,然后将内容复制src/foo
到dest/foo
.当你运行时
cp -R src/. dest
,cp
看到它dest/.
存在,然后只需复制 to 的内容src/.
即可dest/.
。当您将其视为复制名为
.
from的目录src
并将其内容与现有目录合并时dest/.
,这将是有意义的。