为什么我的'find'不能像我期望的那样使用-exec?

Jon*_*son 14 unix shell find

我正在尝试从工作目录中删除所有.svn目录.

我以为我会像这样使用find和rm:

find . -iname .svn -exec 'rm -rf {}' \;
Run Code Online (Sandbox Code Playgroud)

但结果是:

find:rm -rf ./src/.svn:没有这样的文件或目录

显然该文件存在,或者找不到它...我错过了什么?

Dav*_*ebb 27

你不应该把rm -rf {}单引号.

正如你所引用的那样,shell将它的所有参数-exec视为命令而不是命令加参数,所以它正在寻找一个被调用"rm -rf ./src/.svn"但未找到它的文件.

尝试:

find . -iname .svn -exec rm -rf {} \;
Run Code Online (Sandbox Code Playgroud)


Pau*_*lin 7

再见,你应该放弃使用-exec一次性完成多个文件的习惯.例如,我会根据习惯写出来

find . -iname .svn -print | xargs rm -rf
Run Code Online (Sandbox Code Playgroud)

或者,因为我现在使用的是Macintosh,更有可能遇到带有空格的文件或目录名称

find . -iname .svn -print0 | xargs -0 rm -rf 
Run Code Online (Sandbox Code Playgroud)

"xargs"确保每个"N"文件只调用一次"rm",其中"N"通常为20.在这种情况下,这不是一个巨大的胜利,因为rm很小,但如果你想要执行的程序每个文件都很大或者在启动时进行了大量处理,它可以使事情变得更快.

  • 另外,您可以在find的-exec子句后以“ \ +”而不是“ \;”结尾,这等效于使用-print0并将管道传递给xargs。 (2认同)