您编写的内容将换行符分隔的文件名(和路径)列表发送到rm,但 rm 不知道如何处理该输入。它只需要命令行参数。
xargs 接受输入,通常用换行符分隔,并将它们放在命令行上,因此添加 xargs 可以使您的工作正常:
find . -name .svn | xargs rm -fr
xargs 足够智能,它只会将尽可能多的参数传递给rm,因为它可以接受。因此,如果您有一百万个文件,它可能会运行rm 1,000,000/65,000 次(如果您的 shell 可以在命令行上接受 65,002 个参数 {65k files + 1 for rm + 1 for -fr})。
正如人们熟练地指出的那样,以下方法也有效:
find . -name .svn -exec rm -rf {} \;
find . -depth -name .svn -exec rm -fr {} \;
find . -type d -name .svn -print0|xargs -0 rm -rf
前两个-exec 表单都为要删除的每个文件夹调用rm,因此如果您有1,000,000 个文件夹,rm 将被调用1,000,000 次。这当然不太理想。 rm 的较新实现允许您以 + 结束命令,表明 rm 将接受尽可能多的参数:
find . -name .svn -exec rm -rf {} +
最后一个 find/xargs 版本使用 print0,这使得 find 生成使用 \0 作为终止符而不是换行符的输出。由于 POSIX 系统允许文件名中包含除 \0 之外的任何字符,因此这是确保参数正确传递给 rm 或正在执行的应用程序的真正最安全的方法。
此外,还有一个 -execdir 将从找到文件的目录中执行 rm,而不是在基本目录中,还有一个 -depth 将首先开始深度。