14

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

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

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

但结果是:

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

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

4

6 回答 6

27

你不应该把它rm -rf {}放在单引号中。

正如您所引用的,shell 将它的所有参数-exec视为命令而不是命令加参数,因此它正在寻找一个调用的文件"rm -rf ./src/.svn"而不是找到它。

尝试:

find . -iname .svn -exec rm -rf {} \;
于 2009-03-17T16:55:11.620 回答
7

顺便说一下,您可能应该改掉使用 -exec 来处理可以一次对多个文件执行的操作的习惯。例如,我会出于习惯将其写为

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

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

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

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

于 2009-03-17T17:00:13.793 回答
3

也许它只是我,但旧的 find & rm 脚本不适用于我当前的配置,a la:

查找 /data/bin/test -type d -mtime +10 -name "[0-9]*" -exec rm -rf {} \;

而 xargs 解决方案确实如此

查找 /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 插入换行符(其中中断命令) - 遵循 linuxquestions.org 上 nx5000 和 jliagre 的建议,将以下内容添加到 ~/.vimrc:

:设置文件格式=unix

映射 <F4> :set fileformat=unix<CR>

映射 <F5> :set fileformat=dos<CR>

这允许行为以 F4/F5 为中心。

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

头 -1 脚本文件.sh | od -c | 头-1

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

于 2010-11-10T22:05:05.627 回答
1

您也可以使用 svn 命令,如下所示:

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

在这里查看更多信息

于 2009-03-17T16:55:57.267 回答
1

尝试

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

这可能应该适用于 IIRC。

于 2009-03-17T16:55:57.313 回答
0

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

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

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

find . -iname .svn -exec bash -c '
  ls -l "{}" | wc -l
' \;
于 2014-12-12T22:30:09.490 回答