linux - 递归复制特定文件

标签 linux bash find cp

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

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

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

我在正确的父目录中,确实有一个 collect 目录在上面。现在我收到错误:cp: invalid option -- 'o'

出了什么问题?

最佳答案

处理困难的文件名:

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 提供许多文件名,可能会大大减少需要启动的进程数。

关于linux - 递归复制特定文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25881926/

相关文章:

linux - 自动应答 bash 脚本提示

bash - 完全自动建立 ssh 连接并输入 sudo 密码

linux - 使用 bash 判断是否安装了具有给定 UUID 的驱动器

Xcode: "Find In Project"未找到某些文本

linux - 页面缓存限制

c - 为什么 "system"的返回与被调用脚本的返回不匹配?

c - 警告 : type qualifiers ignored on function return type in gcc 4. 1.2

vba - VBA匹配和查找错误: No matching type & Undefined Error

linux - bash:运行 "find --exec ..."命令并终止 "\;",全部存储在变量中?

linux - 将命令结果分配给变量时 Shell 挂起