29

如何递归删除与特定模式匹配的所有文件和目录?例如删除所有“.svn”目录和它们包含的文件?

(遗憾的是仅 DOS)

4

6 回答 6

56

由于您正在寻找 DOS 解决方案,因此上周的帖子几乎相同,共识是:

在Windows中递归删除具有指定名称的文件夹的命令行工具?

对于 /d /r 。%d in (.svn) do @if exists "%d" rd /s/q "%d"

或者

for /f "usebackq" %d in ("dir .svn /ad/b/s") do rd /s/q "%d"

实际上,SVN 还为您提供了导出没有 .svn/_svn 目录的工作目录的选项。

三年后的事后思考:我认为人们最终需要递归删除 .svn/_svn 文件夹的原因是因为他们已直接将本地工作副本复制到新位置,以便对其修改后的版本进行文件夹比较比较到一个干净的导出,即在修改后的本地工作副本出现问题之后。(至少这就是我需要它的原因。在可能的情况下使用'svn export'绝对更容易/更快。)

于 2009-02-10T23:49:31.993 回答
19

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

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

这会递归搜索层次结构中从“.”开始的所有目录(-type d)。(当前目录),并查找名称为 '.svn' 的人;然后将找到的目录列表提供给 rm -rf 以进行删除。

如果您想尝试一下,请尝试

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

这应该为您提供被递归删除的所有目录的列表。

于 2009-02-10T23:43:59.683 回答
7

如果您的文件处于 subversion 中,那么从存储库执行导出将为您提供一个目录树,其中包含 .svn 文件和任何其他杂物被删除。

于 2009-02-10T23:47:11.140 回答
6

像这样的东西可能会奏效,但当然要小心!

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

首先尝试这样的事情来进行试运行:

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

请注意,空括号用文件名填充,转义的分号结束执行的命令(从“-exec”之后开始)。

于 2009-02-10T23:42:43.727 回答
5

在 *nix 或 Cygwin 上:

find -name .svn -print0 | xargs -0 rm -rf
于 2009-02-10T23:41:31.250 回答
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\

等等...

于 2010-07-08T13:18:29.773 回答