情况 1

情况 1

情况 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 扩展可能超出限制。

相关内容