情况 1
我如何复制/home/src/somedir
到/dest/
以使路径始终以 结尾/dest/somedir
,无论是否/dest/somedir
已经存在?
我想避免陷入这样的境地/dest/somedir/somedir
。
情况 2
我如何将里面的所有内容复制/home/src/somedir
到未创建的/dest/
内容中,并且如果已经存在则会被忽略?/dest/somedir
关于尾部斜杠的使用有什么规则吗?我以为以尾部斜杠结尾意味着始终只复制内容,但对我来说这仍然经常出错。
答案1
cp
总是将命令开头的文件复制到命令结尾的文件或目录中。斜线实际上对参数没有太大影响,除非参数是指向目录的符号链接。那么使用斜线会将其视为目录,而省略斜线则会复制链接本身。
假设您想要递归复制示例中的任何子目录,您可以这样做:
cp -r /home/src/somedir /dest
和
cp -r /home/src/somedir/* /dest
第一个获取目录/home/src/somedir
并将该参数、目录本身及其所有内容复制到最后一个参数。如果需要,/dest
它将somedir
在中创建目录/dest
,如果目录已存在,则使用它。
第二个添加*
到第一个参数的末尾,shell 将其扩展为每个不以.
in开头的文件/home/src/somedir
,并将复制所有这些文件和目录,而不/dest
考虑已经存在的内容(除了一些标志将cp
使其提示覆盖目标中与现有文件相同的文件)。
*
正如对这个答案的评论所指出的那样,使用抓取目录中的所有文件存在问题。一种替代方法是使用tar
为您进行复制
tar -c -C /home/src/somedir . | tar -x -C /dest
somedir
这将创建一个不带前导路径的 tar 文件,方法-C
是先切换到该目录。默认情况下,tar
将打印到该目录stdout
,然后我们将通过管道tar
将其提取到另一个目录,然后首先切换到所需的/dest
目录。这还将保留许多文件属性,也cp
可以这样做。
答案2
如何将 /home/src/somedir 复制到 /dest/ 使得路径始终以 /dest/somedir 结尾,无论 /dest/somedir 是否已经存在?
cp -rv /home/src/somedir /dest
我们正在将“somedir”复制到“/dest”,因此最终得到“/dest/somedir”
我如何将 /home/src/somedir 中的所有内容复制到 /dest/,以便不创建 /dest/somedir 并且如果已经存在则会被忽略?
cp -rv /home/src/somedir/* /dest
我们正在将“somedir 中的所有文件” ( somedir/*
) 复制到“/dest”
警告:somedir/* 不包括隐藏文件(以点开头的文件)。
最后的斜杠不会影响进程。您可能会cp
与混淆rsync
,其中尾部斜杠表示“复制内容,而不是文件夹”。
答案3
在 BSD 系统上,在源末尾添加一个斜线:
cp -R src/ dest
在 GNU Linux 系统上,使用 -T 标志:
cp -rT src dest
注意
cp src/* dest
是应该避免的,部分是因为它忽略了隐藏的点文件,部分是因为 glob 扩展可能超出限制。