这个问题已被广泛讨论,但我找不到对我有帮助的解决方案。
我正在尝试有选择地将文件从目录树复制到特定文件夹中。阅读一些问答后,这是我尝试过的:
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/