我正在学习命令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 -exec
于mv
。