递归,非覆盖文件副本?


21

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

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

在尝试了另一个类似的问题之后,我尝试使用cp -n source/**.js desination/cp -Rn source/**.js desination/,但是它似乎没有用。

任何想法如何做到这一点?


您看过rsync吗?
bonob 2014年

@bonob我没有。我曾经使用过一次或两次,但仅用于远程获取文件。
AlbertEngelB 2014年

Answers:


25

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

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

最后,-P如果您要查看进度,--list-only则可以添加一个,如果要查看它在不实际复制的情况下要复制的内容,则可以添加一个,-t如果要保留时间戳记,则可以添加。


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


哈哈,这一个有用! rsync显然是炸弹。
AlbertEngelB

3
是的,我几乎不了解它,但通过尝试回答您的问题只是了解了很多。如果将来需要进一步使用,可以在文件中定义复杂的过滤器,然后在命令中调用它们。您还可以使用按目录的过滤器,在复制时压缩数据,这只是表面上的事情!
bonob 2014年

7

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

sudo cp -vnpr /xxx/* /yyy

xxx =来源

yyy =目的地

v =详细

n =无障碍(无覆盖)

p =保留权限

r =递归


5

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

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

我尝试使用-n,但是它不允许我按* .js文件过滤。
AlbertEngelB 2014年

0

我的发行版没有可用的内容管理器,因此:

echo n | cp -vipr xxx yyy

xxx =来源

yyy =目的地

v =详细

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

p =保留权限

r =递归

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.