这个问题已被广泛讨论,但我找不到可以帮助我的解决方案。
我正在尝试有选择地将文件从目录树复制到特定文件夹中。在阅读了一些Q& A后,这就是我的尝试:
cp `find . -name "*.pdf" -type f` ../collect/
我在正确的父目录中,确实有一个collect
目录,高于上一级。现在我收到错误: cp:无效选项 - 'o'
出了什么问题?
答案 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
的每次调用提供许多文件名,这可能会大大减少需要启动的进程数。