查找 - 如何使用 -exec {} +?

查找 - 如何使用 -exec {} +?

我正在学习命令find,并使用进行有效的搜索-exec cp {} \;

谢谢您的回复。这是我编辑过的问题:(我希望这符合格式惯例。)

下面,我复制了(为了易读,在命令集之间加了一行)一系列显示我正在做的事情的命令。

总结一下:

1)我从 test/testsub1/testsub2 的目录结构开始,其中 test/ 中有 3 个文件,test/testsub1/ 中有 3 个文件;test/testsub1/testsub2/ 中没有文件。

2)我在 test/testsub1/testsub2/ 中创建了 10000 个名为 filesub2-xxxxx 的文件,并使用下一个ls命令确认它们的存在。

3) 我使用find命令定位了 10000 个文件,并使用-exec cp{}test/ \;表达式将它们复制到 test/。使用下一个ls命令进行确认。

4) 我从 test/ 中删除了 10000 个复制的文件。使用下一个ls命令进行确认。

5) 然后我尝试使用完全相同的find命令,除了用 替换,;+或不带引号和反斜杠,但都不起作用。(最后一个版本解决了下面的建议,即“{}”应该放在最后的位置。)

因此,我提出了这个问题。

mr@dpobx:~$ ls -R test/
test/:
file1
file2
file3
testsub1

test/testsub1:
filesub1
filesub2
filesub3
testsub2

test/testsub1/testsub2:

mr@dpobx:~$ touch test/testsub1/testsub2/filesub2-{00001..10000}

mr@dpobx:~$ ls test/testsub1/testsub2/ | wc -l
10000

mr@dpobx:~$ time find test/ -iname "*sub2-*" -exec cp '{}' test/ \;

real    0m8.397s
user    0m6.484s
sys 0m1.943s

mr@dpobx:~$ ls test/ | wc -l
10004

mr@dpobx:~$ rm -f test/filesub2-*

mr@dpobx:~$ ls test/ | wc -l
4

mr@dpobx:~$ time find test/ -iname "*sub2-*" -exec cp '{}' test/ \+
find: missing argument to `-exec'

real    0m0.004s
user    0m0.001s
sys 0m0.003s

mr@dpobx:~$ time find test/ -iname "*sub2-*" -exec cp '{}' test/ '+'
find: missing argument to `-exec'

real    0m0.005s
user    0m0.001s
sys 0m0.004s

mr@dpobx:~$ time find test/ -iname "*sub2-*" -exec cp '{}' test/ +
find: missing argument to `-exec'

real    0m0.004s
user    0m0.004s
sys 0m0.000s

mr@dpobx:~$ time find test/ -iname "*sub2-*" -exec cp test/ '{}' \+
cp: target 'test/testsub1/testsub2/filesub2-07915' is not a directory
cp: target 'test/testsub1/testsub2/filesub2-05333' is not a directory
cp: target 'test/testsub1/testsub2/filesub2-07548' is not a directory

real    0m0.033s
user    0m0.019s
sys 0m0.015s

mr@dpobx:~$ 

答案1

使用时-exec ... +{}必须总是排在最后。

请参阅语法man find

-exec command {} +

因此这是行不通的:

find . -exec cp {} my/target/ +

您需要使用第三种形式cp并使用该-t, --target-directory=DIRECTORY选项:

cp [OPTION]... -t DIRECTORY SOURCE

因此,这应该可行:

find . -exec cp -t my/target/ {} +

顺便说一句:同样适用find -execmv

相关内容