我的应用程序中有一个导出工具,它的任务之一是清理应用程序目录树中的所有.svn目录。我正在寻找Linux shell中的递归命令,它将遍历整个树并删除.svn文件。
我没有使用export,因为这个脚本将用于其他一些与SVN无关的文件/目录名称。我试过这样的方法:
find . -name .svn | rm -fr它不起作用。
发布于 2009-08-18 15:23:54
试试这个:
find . -name .svn -exec rm -rf '{}' \;在运行这样的命令之前,我通常喜欢先运行以下命令:
find . -name .svn -exec ls '{}' \;发布于 2009-08-18 15:39:26
您编写的内容会将换行符分隔的文件名(和路径)列表发送到rm,但是rm不知道如何处理这些输入。它只需要命令行参数。
xargs接受通常由换行符分隔的输入,并将它们放在命令行中,因此添加xargs可以实现以下功能:
find . -name .svn | xargs rm -frxargs足够智能,它只会向rm传递它能接受的尽可能多的参数。因此,如果您有一百万个文件,它可能会运行rm 1,000,000/65,000次(如果您的shell可以接受命令行上的65,002个参数{65k文件+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将首先从深度开始。
发布于 2009-08-18 15:57:49
不需要管道、xargs、exec或任何东西:
find . -name .svn -delete编辑:只是在开玩笑,显然-delete在幕后调用unlinkat(),所以它的行为类似于unlink或rmdir,并将拒绝对包含文件的目录进行操作。
https://stackoverflow.com/questions/1294590
复制相似问题