递归的、非覆盖的文件复制?

Alb*_*elB 31 linux file-transfer cp

我有一个目录,其中包含一堆其他包含 CoffeeScript/JavaScript 文件的文件夹。我能够将 CoffeeScript 文件编译到一个具有相同文件夹结构的新文件夹中。

我想要做的是将源文件夹中的所有 *.js 文件递归复制到目标文件夹。我也不想覆盖目标文件夹中已经存在的任何文件。关于如何实现这一点的任何想法?

在查看了另一个类似的问题后,我尝试使用cp -n source/**.js desination/cp -Rn source/**.js desination/,但它似乎不起作用。

知道如何做到这一点吗?

bon*_*nob 32

您可以使用 rsync (它也可以进行本地复制)

rsync -r --ignore-existing --include=*/ --include=*.js --exclude=* source/ destination
Run Code Online (Sandbox Code Playgroud)
  • -r 递归到目录中,
  • --ignore-existing 忽略目标中的现有文件,
  • includeexclude筛选器是指:包括所有的目录,包括所有的* .js文件,排除其余的; 需要第一个包含,否则最后的排除也将在扫描内容之前排除目录。

最后,您可以添加一个-Pif 您想观看进度,一个--list-onlyif 您想查看它将复制的内容而不实际复制,以及一个-tif 您想保留时间戳。


这不相关,但我最近学习了 rsync 命令,当时我将 15 年的文档从一个分区移动到另一个分区。确信我的文件在那里,然后我擦除了旧分区并在那里放了一些其他东西;后来我意识到我丢失了所有时间戳,并发现了 -t 标志。只是想分享我的苦恼:'(

  • 是的,我几乎不知道,但只是通过尝试回答您的问题而了解了很多。如果你以后需要更进一步,你可以在文件中定义复杂的过滤器,并在命令中调用它们。您还可以对每个目录进行过滤,在复制时压缩数据,而这只是触及它的表面! (3认同)

小智 17

这也可以使用 cp 来实现。看这里:

sudo cp -vnpr /xxx/* /yyy
Run Code Online (Sandbox Code Playgroud)

xxx = 来源

yyy = 目的地

v = 冗长

n = 无破坏(无覆盖)

p = 保留权限

r = 递归


小智 5

查看手册页,您似乎想要该-n选项。

-n, --no-clobber
   do not overwrite an existing file (overrides the previous -i option)
Run Code Online (Sandbox Code Playgroud)