递归删除匹配文件和目录的命令行

29
如何递归删除所有匹配特定模式的文件和目录?例如,删除所有“.svn”目录及其包含的文件?(注:仅限于DOS系统)
6个回答

56

由于您正在寻找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'肯定更容易/更快速。)


5
实际上,显然TortoiseSVN还提供了一种选项,可以导出没有.svn/_svn目录的工作目录。我认为这是svn本身(svn export)的一个特性,不仅仅是TortoiseSVN,因此任何其他客户端也可以做到。 - Tyler
那很好!Windows资源管理器并不总是删除.svn文件。 - cbmeeks
或者尝试在http://superuser.com/questions/409479/how-do-i-recursively-delete-all-files-or-folders-whose-names-match-a-pattern-in中建议的硬核DOS变体。 - Gregor
如果我想要使用这个命令递归地删除文件名,我需要修改什么?目前这个命令只能用于文件夹。 - Dev G
我曾多次需要清除所有的.svn目录,因为TortoiseSvn损坏了本地仓库,通常是由于应用程序在操作中崩溃、用户尝试以奇怪的方式分支或用户误解还原或恢复而导致的。 - Chris Moschini

19

这是Unix还是Windows?在Unix上,一个简单的解决方案是:

find . -name '.svn' -type d | xargs rm -rf

这个命令在当前目录 "." 开始递归地搜索所有目录 (-type d),并查找名称为 ".svn" 的目录;然后将找到的目录列表传递给 rm -rf 进行删除。

如果您想尝试它,请尝试:

find . -name '.svn' -type d | xargs echo

这将为您提供一个列表,其中包含所有将被递归删除的目录。


1
我点赞是因为我正在寻找相同的问题,在Win32上安装了gnutils - 所以这对我非常完美。天啊,纯DOS太疯狂了! - Michael Paulukonis
2
因为错误使用rm+xargs+find被降低评分。在这种情况下,你应该始终使用-print0NUL终止符,否则就会等待灾难的发生。 - TC1
@Meltemi 好久不见了,但是1)问题要求一个通用的解决方案,‘.svn’只是一个例子,2)*nix文件名可以包含除了NULL字节和正斜杠之外的几乎任何字符。对于这个问题来说,空格是有害的,一个带有空格字符的示例名称将在层次结构中具有名为foo bar的目录和当前目录中名为bar的目录。然后你搜索foo*,它将some/path/foo bar提供给rm,第一个会默默失败并删除bar。请参见下面greyfade的答案或使用GNU find的-delete - TC1
好的,开始有点明白了。我今天需要做类似的事情,但不知道-print0或者-0标志是什么意思,而且很难找到相关文档。在Mac上,许多(大多数?)文件/目录名称中都有空格…所以你的评论引起了我的好奇心。#unix乐趣 - Meltemi
就我个人而言,我选择了以下命令来满足我的需求:find . -name '.svn' -type d -exec rm -rf '{}' +。虽然这看起来有点晦涩,但它确实有效... - Meltemi
显示剩余2条评论

7
如果您的文件在Subversion中,那么从存储库进行导出将给您一个目录树,移除了 .svn 文件和任何其他无关内容。

请注意,导出的版本将不包含您工作目录中可能存在的任何未提交更改(为此,您需要先提交再导出)。 - Jaysen Marais

6

尝试这样做可能会有所帮助,但是当然要小心使用!

find . -name ".svn" -exec rm -rf {} \;

首先尝试这样做一个干跑:

find . -name ".*" -exec echo {} \;

请注意,空括号将被填充为文件名,并且转义的分号终止执行的命令(在“-exec”之后开始)。

这对我非常完美地起了作用。谢谢!我需要删除所有的“CVS”目录,所以我运行了一个 find . -name "CVS" -exec rm -rf {} ;。 - cmcculloh

5

在*nix或Cygwin上:

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

只为正确的 find + rm 点赞。 - TC1

1
如果你想要在不导出并删除项目中的 .svn 的情况下进行复制,你应该使用 XCOPY 的 /EXCLUDE 选项。
像这样:
xcopy /S/Q/EXCLUDE:svn.excludelist [path_from] [path_to\]

注意 [path_to] 中的 "\"(反斜杠)。它确定它是一个输出目录,因此,xcopy 不会询问它是文件还是目录。

svn.excludelist 是一个文本文件,其中包含按行分隔的要忽略复制的模式。

例如:

.svn
.svn\
\.svn\
.obj
.o
.lib
\src\

等等...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接