【发布时间】:2010-10-06 19:04:38
【问题描述】:
如何递归删除所有符合特定模式的文件和目录?例如删除所有“.svn”目录及其包含的文件?
(遗憾的是仅限 DOS)
【问题讨论】:
标签: svn command-line file recursion dos
如何递归删除所有符合特定模式的文件和目录?例如删除所有“.svn”目录及其包含的文件?
(遗憾的是仅限 DOS)
【问题讨论】:
标签: svn command-line file recursion dos
由于您正在寻找 DOS 解决方案,上周的帖子几乎相同,共识是:
Command line tool to delete folder with a specified name recursively in Windows?
对于 /d /r 。 (.svn) 中的 %d 做 @if 存在 "%d" rd /s/q "%d"
或
for /f "usebackq" %d in ("dir .svn /ad/b/s") 做 rd /s/q "%d"
实际上,SVN 还为您提供了导出没有 .svn/_svn 目录的工作目录的选项。
三年后的事后思考: 我认为人们最终需要递归删除 .svn/_svn 文件夹的原因是因为他们直接将本地工作副本复制到新位置,以便将修改后的版本与干净的导出进行文件夹比较,即在修改后的本地工作副本出现问题之后。 (至少这就是我需要它的原因。在可能的情况下使用 'svn export' 绝对更容易/更快。)
【讨论】:
svn export) 而不仅仅是 TortoiseSVN,所以任何其他客户端也可以做到。
这是 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 终止,否则它只是等待发生的灾难。
NULL 字节和其中的正斜杠。空格对此有害,名称中带有空格字符的示例将在层次结构中的某处有一个名为foo bar 的目录,在当前目录中有一个名为bar 的目录。然后你搜索foo*,它将some/path/foo bar 提供给rm,第一个会静默失败并删除bar。请参阅下面的 grayfade 答案或使用-delete 进行 GNU 查找。
-print0 或-0 标志是什么意思并且很难找到文档。在 Mac 上,这么多(大多数?)文件/目录中都有空格字符……所以你的评论激起了我的好奇心。 #funwithunix
如果您的文件处于 subversion 中,那么从存储库中执行导出将为您提供一个目录树,其中包含 .svn 文件并删除了任何其他杂物。
【讨论】:
这样的事情可能会奏效,但当然要小心!
find . -name ".svn" -exec rm -rf {} \;
先试试这样的方法来做一次试运行:
find . -name ".*" -exec echo {} \;
请注意,空括号用文件名填充,转义的分号结束执行的命令(从“-exec”之后开始)。
【讨论】:
在 *nix 或 Cygwin 上:
find -name .svn -print0 | xargs -0 rm -rf
【讨论】:
find+rm。
如果您想复制它而不从项目中导出和删除 .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\
等等……
【讨论】: