如何理解是否cp
会复制文件夹的内容或文件夹本身。
例如,我有一个文件/some/path/text.txt
。
如果我这样做cp -r /some/path /another/path2
,文件的新路径将是/another/path2/text.txt
?
如果我这样做cp -r /some/path/ /another/path2
,新路径是什么/another/path2/text.txt
?
如果我这样做cp -r /some/path/ /another/path2/
,会发生什么?
如果我这样做cp -r /some/path /another/path2/
,会发生什么?
我总是对此感到困惑,很多时候我都会纠正我的错误复制。我试图找到有关此的信息,但没有找到任何结构化信息
答案1
在大多数情况下这并不重要。相反,“cp”会根据目的地是否存在来决定。
假设源始终是一个目录,并且您正在使用cp -r
或cp -a
:
如果来源是符号链接到目录,那么源文件后面的斜杠很重要。如果没有它,你只能复制符号链接本身而不是它指向的目录。
如果源不是符号链接,则源后面的斜杠对于“cp”来说无关紧要。
如果目标指向现有目录,然后所有的源目录将被复制到目标中。也就是说,
cp -r abc def
将导致def/abc/text.txt
创建。源和目标上的尾部斜杠无关紧要。如果目标不存在,则将复制源目录作为目标。也就是说,
cp -r abc def
只会创建def/text.txt
。尾部斜杠也不会影响此处的任何内容。
第二条“规则”可能很烦人,因为似乎你不能复制现有目录的内容直接进入另一个目录,而无需采取类似措施abc/*
(这会丢失隐藏文件)等。
但是,实现此目的的一个简单方法是将其指定.
为最后一个路径组件 - 这将欺骗 cp.
在目标中“创建”:
cp -r /some/path/. /another/path
目的地尾部的斜杠仍然无关紧要。
(请注意,这些规则并不适用于所有程序;特别是,rsync 的行为有所不同并且尾随斜杠确实告诉它是否复制整个目录或仅复制其内容。)
简而言之:
- 如果你想复制目录所有的,确保目标已经存在(使用 mkdir 预先创建)。
- 如果你想复制目录的内容,确保以
/.
(斜线+点)结束源(如网站)。