我如何复制/home/src/somedir
到/dest/
使得路径总是以 结束/dest/somedir
,而不管是否/dest/somedir
已经存在?
我想避免以/dest/somedir/somedir
.
如何复制里面的一切/home/src/somedir
,以/dest/
这样/dest/somedir
不创建,如果它已经存在被忽略?
是否有关于我可以使用的尾部斜杠的规则?我认为以斜杠结尾意味着总是只复制内容,但对我来说它仍然经常出错。
cp
将始终将命令开头的文件复制到命令结尾的文件或目录中。斜线对参数没有太大作用,除非参数是指向目录的符号链接。然后使用斜杠会将其视为目录,而省略斜杠将复制链接本身。
假设您想递归复制示例中的任何子目录,您可以这样做:
cp -r /home/src/somedir /dest
Run Code Online (Sandbox Code Playgroud)
和
cp -r /home/src/somedir/* /dest
Run Code Online (Sandbox Code Playgroud)
第一个获取目录/home/src/somedir
并将该参数、目录本身及其所有内容复制到最后一个参数/dest
. 如果需要,它将somedir
在其中创建目录,/dest
如果它已经存在则使用它。
第二个添加*
到第一个参数的末尾,shell 将扩展为每个不以.
in开头的文件,/home/src/somedir
并将复制所有这些文件和目录,/dest
而不考虑已经存在的内容(除了一些标志cp
将使其提示覆盖目标中与现有文件相同的文件)。
正如对此答案的评论所指出的那样,使用*
抓取目录中的所有文件存在问题。一种替代方法是使用tar
为您做副本
tar -c -C /home/src/somedir . | tar -x -C /dest
Run Code Online (Sandbox Code Playgroud)
这将somedir
通过首先使用-C
切换到该目录来创建一个没有前导路径的 tar 文件。默认情况下tar
将打印到stdout
它,然后我们将通过管道传输到另一个tar
以首先将其提取到所需的/dest
目录中。这也将保留许多文件属性,这cp
也可以。