递归复制特定文件

时间:2014-09-17 03:44:22

标签: linux bash find cp

这个问题已被广泛讨论,但我找不到可以帮助我的解决方案。

我正在尝试有选择地将文件从目录树复制到特定文件夹中。在阅读了一些Q& A后,这就是我的尝试:

cp `find . -name "*.pdf" -type f` ../collect/

我在正确的父目录中,确实有一个collect目录,高于上一级。现在我收到错误: cp:无效选项 - 'o'

出了什么问题?

1 个答案:

答案 0 :(得分:2)

处理困难的文件名:

find . -name "*.pdf" -type f -exec cp {} ../collect/ \;

默认情况下,find将打印找到的文件名。如果使用-exec选项,它会将文件名传递给您选择的命令,在本例中为cp命令,该命令写为:

cp {} ../collect/ \;

{}告诉find插入文件名的位置。给-exec的命令的结尾用分号标记。通常情况下,shell会吃分号。因此,我们使用反斜杠转义分号,以便将其作为参数传递给find命令。

由于find直接将文件名提供给cp而没有来自shell的干扰,因此这种方法适用于最困难的文件名。

更高效率

以上内容在找到的每个文件上运行cp。如果有很多文件,那么很多进程就会启动。如果有一个GNU工具,可以按如下方式避免:

find . -name '*.pdf' -type f -exec cp -t ../collect {} +

在命令的这个变体中,find将为cp的每次调用提供许多文件名,这可能会大大减少需要启动的进程数。