如何递归删除所有匹配特定模式的文件和目录?例如,删除所有“.svn”目录及其包含的文件?(注:仅限于DOS系统)
由于您正在寻找DOS解决方案,上周的帖子几乎完全相同,并且共识是:
在Windows中递归删除具有指定名称的文件夹的命令行工具?
对于 /d /r . %d in (.svn),如果存在“%d”,则 rd /s/q “%d”
或者使用
对于 /f "usebackq" %d in ("dir .svn /ad/b/s"),则 rd /s/q "%d"
实际上,SVN还提供了一种选项,可以导出一个没有.svn/_svn目录的工作目录。
三年后的思考: 我认为人们最终需要递归删除.svn/_svn文件夹的原因是因为他们直接将本地工作副本复制到新位置,以便比较修改版本和干净的导出版本,即在修改本地工作副本出现问题后。 (至少这就是我需要的原因。如果可能的话,使用'svn export'肯定更容易/更快速。)
这是Unix还是Windows?在Unix上,一个简单的解决方案是:
find . -name '.svn' -type d | xargs rm -rf
这个命令在当前目录 "." 开始递归地搜索所有目录 (-type d),并查找名称为 ".svn" 的目录;然后将找到的目录列表传递给 rm -rf 进行删除。
如果您想尝试它,请尝试:
find . -name '.svn' -type d | xargs echo
这将为您提供一个列表,其中包含所有将被递归删除的目录。
rm
+xargs
+find
被降低评分。在这种情况下,你应该始终使用-print0
和NUL
终止符,否则就会等待灾难的发生。 - TC1NULL
字节和正斜杠之外的几乎任何字符。对于这个问题来说,空格是有害的,一个带有空格字符的示例名称将在层次结构中具有名为foo bar
的目录和当前目录中名为bar
的目录。然后你搜索foo*
,它将some/path/foo bar
提供给rm
,第一个会默默失败并删除bar
。请参见下面greyfade的答案或使用GNU find的-delete
。 - TC1-print0
或者-0
标志是什么意思,而且很难找到相关文档。在Mac上,许多(大多数?)文件/目录名称中都有空格…所以你的评论引起了我的好奇心。#unix乐趣 - Meltemifind . -name '.svn' -type d -exec rm -rf '{}' +
。虽然这看起来有点晦涩,但它确实有效... - Meltemi尝试这样做可能会有所帮助,但是当然要小心使用!
find . -name ".svn" -exec rm -rf {} \;
首先尝试这样做一个干跑:
find . -name ".*" -exec echo {} \;
在*nix或Cygwin上:
find -name .svn -print0 | xargs -0 rm -rf
find
+ rm
点赞。 - TC1xcopy /S/Q/EXCLUDE:svn.excludelist [path_from] [path_to\]
注意 [path_to] 中的 "\"(反斜杠)。它确定它是一个输出目录,因此,xcopy 不会询问它是文件还是目录。
svn.excludelist 是一个文本文件,其中包含按行分隔的要忽略复制的模式。
例如:
.svn
.svn\
\.svn\
.obj
.o
.lib
\src\
等等...
svn export
)的一个特性,不仅仅是TortoiseSVN,因此任何其他客户端也可以做到。 - Tyler