【问题标题】:Command line to delete matching files and directories recursively递归删除匹配文件和目录的命令行
【发布时间】:2010-10-06 19:04:38
【问题描述】:

如何递归删除所有符合特定模式的文件和目录?例如删除所有“.svn”目录及其包含的文件?

(遗憾的是仅限 DOS)

【问题讨论】:

    标签: svn command-line file recursion dos


    【解决方案1】:

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

    【讨论】:

    • “实际上,TortoiseSVN 显然也为您提供了导出没有 .svn/_svn 目录的工作目录的选项。”我相信这是 svn 本身的一个特性 (svn export) 而不仅仅是 TortoiseSVN,所以任何其他客户端也可以做到。
    • 太好了! Windows 资源管理器并不总是删除 .svn 文件。
    • 或尝试superuser.com/questions/409479/…中建议的硬核DOS变体
    • 如果我想使用此命令递归删除文件名,我必须在此修改什么?目前这仅适用于文件夹
    • 我不止一次需要核对所有 .svn 目录,因为 TortoiseSvn 占用了本地存储库,通常是由于应用程序在运行中崩溃,用户试图分支一种奇怪的方式,或者用户误解了 Revert 或 Recover。
    【解决方案2】:

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

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

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

    如果你想尝试一下,试试吧

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

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

    【讨论】:

    • 我投了赞成票,因为我在 Win32 上寻找同样的问题,但安装了 gnutils——所以这对我来说非常有效。伙计,纯 DOS 太疯狂了!
    • 支持 - 我需要一个基于 unix 的解决方案来摆脱糟糕的 eclipse .project 和 .settings 文件。谢谢! :D
    • rm+xargs+find的错误使用投反对票。在这种情况下,您应该始终在一般情况下使用 -print0NUL 终止,否则它只是等待发生的灾难。
    • @Meltemi 已经有一段时间了,但是 1)问题需要一个通用的解决方案,“.svn”只是给出的一个例子,2)*nix 文件名可以包含几乎任何东西,除了NULL 字节和其中的正斜杠。空格对此有害,名称中带有空格字符的示例将在层次结构中的某处有一个名为foo bar 的目录,在当前目录中有一个名为bar 的目录。然后你搜索foo*,它将some/path/foo bar 提供给rm,第一个会静默失败并删除bar。请参阅下面的 grayfade 答案或使用-delete 进行 GNU 查找。
    • 好的,开始有意义了。我今天需要做这样的事情,不知道-print0-0 标志是什么意思并且很难找到文档。在 Mac 上,这么多(大多数?)文件/目录中都有空格字符……所以你的评论激起了我的好奇心。 #funwithunix
    【解决方案3】:

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

    【讨论】:

    • 请注意,导出的版本不会包含您在工作目录中可能拥有的任何未提交的更改(因为您需要先提交然后导出)
    【解决方案4】:

    这样的事情可能会奏效,但当然要小心!

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

    先试试这样的方法来做一次试运行:

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

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

    【讨论】:

    • 这对我来说非常有效。谢谢!我需要删除所有“CVS”目录,所以我运行了一个 find 。 -name "CVS" -exec rm -rf {} \;
    【解决方案5】:

    在 *nix 或 Cygwin 上:

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

    【讨论】:

    • 在这里只支持正确的find+rm
    【解决方案6】:

    如果您想复制它而不从项目中导出和删除 .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\
    

    等等……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-19
      • 2013-06-07
      • 2011-12-31
      • 2015-05-21
      • 2014-05-12
      • 1970-01-01
      • 2022-12-10
      相关资源
      最近更新 更多