iFr*_*cht 23 documentation hard-link cp recursive dot-files
这个答案表明可以将所有文件(包括隐藏文件)从目录复制src到目录中,dest如下所示:
mkdir dest
cp -r src/. dest
Run Code Online (Sandbox Code Playgroud)
答案或其评论中没有解释为什么这实际上有效,似乎也没有人找到有关此的文档。
我尝试了一些东西。一、正常情况:
$ 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
Run Code Online (Sandbox Code Playgroud)
然后,/.最后:
$ 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
Run Code Online (Sandbox Code Playgroud)
因此,这与 的行为类似*,但也会复制隐藏文件。
$ 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
Run Code Online (Sandbox Code Playgroud)
.并且..是正确的硬链接,如此处所述,就像目录条目本身一样。
这种行为来自哪里,记录在哪里?
Ste*_*itt 32
该行为是 的文档化算法的逻辑结果cp -R。参见POSIX,步骤 2f:
应将目录source_file 中的文件复制到目录dest_file,执行此处列出的四个步骤(1 到 4),文件为source_files。
.和..是目录,分别是当前目录和父目录。就 shell 而言,它们都不是特殊的,因此它们都与扩展无关,并且目录将被复制,包括隐藏文件。*,另一方面,将扩展为文件列表,这是过滤掉隐藏文件的地方。
src/.是里面的当前目录src,也就是src它本身;src/src_dir/..是src_dir的父目录,也就是src. 所以从外部src,ifsrc是一个目录,指定src/.或src/src_dir/..作为源文件 forcp是等价的,并复制其中的内容src,包括隐藏文件。
指定的要点src/.是,如果src不是目录(或目录的符号链接),它将失败,而src不会。它也会src只复制内容,而不复制src自身;这也符合文档:
如果target存在并命名现有目录,则文件层次结构中每个文件的相应目标路径的名称应为target的串联,如果 target 不以斜杠结尾,则为单个斜杠字符,以及文件相对路径名到包含source_file的目录。
因此cp -R src/. dest复制srcto的内容dest/.(源文件.在src),而cp -R src dest复制srcto的内容dest/src(源文件在src)。
另一种思考方式是比较复制src/src_dir和src/.,而不是比较src/.和src。.行为就像src_dir前一种情况。