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

79

我想要在每个文件夹和子文件夹中删除所有"_svn"...

例如

c:\
  proyect1
   _svn
   images
     _svn
     banner
       _svn
     buttons
       _svn

然后我运行类似于以下命令:

rm-recurse c:\proyect1 _svn

我应该得到:

c:\
  proyect1
   images
     banner
     buttons

最理想的情况是一个小巧的独立EXE或类似的东西。

-- 感谢Grant,我一发布问题就看到了关于SVN export命令的SVN文档,但我还想删除Visual Studio创建的_vti_*文件夹,所以我也会探索使用for解决方案。


请将此重新表述为一个问题;您是在寻求开发工具的帮助,还是想知道是否有这样的工具可用? - Rob
14
.bat文件不能解决所有Windows问题,有时你需要先填写它们的命令和材料。 - Grant
8个回答

150
与BlackTigerX的“for”类似,我建议使用以下代码: for /d /r . %d in (_svn) do @if exist "%d" rd /s/q "%d"

3
是的,因为这个“for”的特性是在递归遍历目录树时,将“_svn”添加到每个目录条目中。 - JMD
1
虽然这已经超过2年了,但你教给了我新的东西!谢谢。 - Ryan Ternier
5
@DavidKEgghead,请将“.”(当前目录)替换为您想要搜索的目录。如果您的目标包含空格,请确保用引号括起来。因此,您可以使用以下命令:for /d /r "D:\Projects" %d in (_svn) do @if exist "%d" rd /s/q "%d" 我经常通过先用echo替换实际操作来测试这些命令:for /d /r "D:\Projects" %d in (_svn) do @if exist "%d" echo "%d" 这样我就能看到我将要影响哪些内容了。 - JMD
3
当我递归运行时,有时会出现“the-directory-is-not-empty”的提示。为什么会这样?可能的原因是什么? - SabareeshSS
7
如果您想将此保存为批处理文件,请不要忘记用%%替换%。 - Jesper Mygind
显示剩余4条评论

42

是时候学习一些PowerShell了 ;o)

Get-ChildItem -path c:\projet -Include '_svn' -Recurse -force | Remove-Item -force -Recurse

第一部分递归查找每个_svn文件夹。使用Force参数来查找隐藏文件夹。 第二部分用于删除这些文件夹及其内容。 Remove命令带有一个方便的"whatif"参数,允许预览将要执行的操作。

PowerShell可用于Windows XP和Windows Vista。它默认安装在Windows 7和Windows Server 2008 R2上。

这是一个微软产品,它是免费的,非常好用!


此解决方案在Windows Server 2008 R2上完美运行。谢谢。 - STT LCU
1
有人知道“whatif”参数的语法吗?它可以预览将要执行的操作。 - alias51
1
只需在行末添加“-whatif”即可。这是Remove-Item Cmdlet的一个选项。 - Cédric Rup

26

如果要在批处理文件中调用(例如删除Debug和Release文件夹),请使用以下命令:

for /d /r . %%d in (Debug Release) do @if exist "%%d" echo "%%d" && rd /s/q "%%d"

在批处理文件中,双重百分号%是必需的作为转义字符。否则会报告语法错误。

谢谢。


15

我遇到了一个错误:找不到dir文件,我尝试了cmd.exe /c dir ...,但是我仍然收到相同的错误。但是,JMD的解决方案奏效了... - opensas
哎呀,我检查了你链接的页面,似乎缺少了几个单引号...修复这个问题也解决了... - opensas

10

在Windows系统中?如果您正在使用tortoiseSVN,您可以使用导出命令来导出一个不包含 .svn/_svn 文件夹的项目副本。


1
无论您使用的是Windows还是其他操作系统,您都可以使用命令行工具执行svn导出操作。 - Parappa
我认为人们最终需要递归删除 .svn/_svn 文件夹的原因是因为他们直接将本地工作副本复制到新位置,以便比较已修改版本与干净导出版本的文件夹,即在修改后的本地工作副本出现问题时。 (至少这就是我需要它的原因。如果可能的话,使用“svn export”肯定更容易/更快。) - JMD

4
import os
import shutil

curdir = os.path.abspath(os.path.dirname(__file__))

def removedir(dirname, name = ".svn"):
    if os.path.isdir(dirname):
        for file in os.listdir(dirname):
            if os.path.isdir(os.path.join(dirname, file)) and file == name:
                thedir = os.path.join(dirname, name)
                shutil.rmtree(thedir)
                print ".",
            else:
                removedir(os.path.join(dirname, file))

我认为你可以尝试这个Python脚本,只要你安装了Python,它就可以在任何操作系统上运行。

3

1
作为长期使用TotalCommander(以前是Windows Commander!)的用户,我不能让这个答案保持消极。对于已经安装了TC的人来说,这是一个很好的、简单的解决方案。我很高兴学到了这个巧妙的技巧。谢谢! - Adam Tuttle
1
这里最直接的解决方案! - Amio.io

3

另一个来自SVN论坛的选项:使用包含要排除的文件/目录列表的文件进行XCopy操作(在这种情况下为.svn或_svn)

XCopy C:\VersionedFolder C:\UnVersionedFolder /EXCLUDE:C:\No.SVN.txt /E /C /I /F /R /Y

1
或者使用 ROBOCOPY,它不需要列表文件。 - kayleeFrye_onDeck

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