在这些情况下,如何使用 cp 在 Linux 中复制目录?

Per*_*son 4 linux bash cp

情况一

我如何复制/home/src/somedir/dest/使得路径总是以 结束/dest/somedir,而不管是否/dest/somedir已经存在?

我想避免以/dest/somedir/somedir.

情况二

如何复制里面的一切/home/src/somedir,以/dest/这样/dest/somedir不创建,如果它已经存在被忽略?


是否有关于我可以使用的尾部斜杠的规则?我认为以斜杠结尾意味着总是只复制内容,但对我来说它仍然经常出错。

Eri*_*ouf 7

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也可以。

  • 值得注意的是,如果匹配太多,`*` 通配符扩展将失败。我不知道确切的数字,但上次失败时,该目录包含大约 100000 个文件/目录。 (2认同)