递归、非覆盖文件复制?

递归、非覆盖文件复制?

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

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

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

知道如何实现这个吗?

答案1

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

rsync -r --ignore-existing --include=*/ --include=*.js --exclude=* source/ destination
  • -r递归进入目录,
  • --ignore-existing忽略目标中的现有文件,
  • include和过滤exclude器的意思是:包含所有目录,包含所有 *.js 文件,排除其余文件;需要第一个包含,否则最后的排除也会在扫描目录内容之前排除目录。

最后,-P如果您想查看进度,可以添加一个;--list-only如果您想查看它将复制什么而不实际复制,可以添加一个-t;如果您想保留时间戳,可以添加一个。


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

答案2

这也可以使用 cp 实现。请参见此处:

sudo cp -vnpr /xxx/* /yyy

xxx = 来源

yyy = 目的地

v = 详细

n = 无破坏(无覆盖)

p = 保留权限

r = 递归

答案3

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

-n, --no-clobber
   do not overwrite an existing file (overrides the previous -i option)

答案4

我的发行版没有可用的 clobber,因此:

echo n | cp -vipr xxx yyy

xxx = 来源

yyy = 目的地

v = 详细

i = 交互式(提示覆盖)|这就是为什么命令前面有“echo n |”

p = 保留权限

r = 递归

相关内容