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

时间:2009-03-17 16:52:31

标签: unix shell find

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

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

find . -iname .svn -exec 'rm -rf {}' \;

但结果是:

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

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

6 个答案:

答案 0 :(得分:27)

您不应将rm -rf {}放在单引号中。

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

尝试:

find . -iname .svn -exec rm -rf {} \;

答案 1 :(得分:7)

再见,您应该不再习惯使用-exec来实现可以同时对多个文件执行的操作。例如,我会用习惯写出这个

find . -iname .svn -print | xargs rm -rf

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

find . -iname .svn -print0 | xargs -0 rm -rf 

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

答案 2 :(得分:3)

也许它只是我,但旧的发现& rm脚本在我当前的配置上工作,la:

  

find / data / bin / test -type d -mtime +10 -name“[0-9] *” - exec rm -rf {} \;

而xargs解决方案 ,la:

  

find / data / bin / test -type d -mtime +10 -name'[0-9] *'-print | xargs rm -rf;

不明白为什么,但我已经更新了我的scriptLib,所以我不会再花几个小时殴打 我的头很简单......

(在kernel-2.6.18-194.11.3.el5下运行RHEL)

编辑:找出原因 - 我的RHEL发行版默认vi将可怕的cr插入换行符(打破命令) - 遵循nx5000& linuxintions.org上的jliagre,将以下内容添加到〜/ .vimrc:

  

:set fileformat = unix

     

map< F4> :set fileformat = unix< CR>

     

map< F5> :set fileformat = dos< CR>

允许行为在F4 / F5上旋转。

检查CR是否嵌入到您的文件中:

  

head -1 scriptFile.sh | od -c |头-1 -

http://www.linuxquestions.org/questions/linux-general-1/bad-interpreter-no-such-file-or-directory-213617/

答案 3 :(得分:1)

您也可以按如下方式使用svn命令:

svn export <url-to-repo> <dest-path>

Look here for more info

答案 4 :(得分:1)

尝试

find . -iname .svn -exec rm -rf {} \;

那可能应该是IIRC的工作。

答案 5 :(得分:0)

您可以使用以下技巧传递您想要的任何引号。

find . -iname .svn -exec bash -c 'rm -rf {}' \;

exec选项很高兴看到您只是使用参数调用可执行文件,但您的参数将能够包含基本上任何大小和形状的脚本。

find . -iname .svn -exec bash -c '
  ls -l "{}" | wc -l
' \;