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


75

我想删除每个文件夹和子文件夹中的每个“ _svn” ...

例如

C:\
  proyect1
   _svn
   图片
     _svn
     旗帜
       _svn
     纽扣
       _svn

然后我运行类似

rm-recurse c:\proyect1 _svn

我应该得到:

C:\
  proyect1
   图片
     旗帜
     纽扣

理想的情况是使用小型独立EXE或类似的文件。

-感谢Grant,在我发布问题后,我看到了有关SVN导出命令的SVN文档,但是我也想删除Visual Studio创建的_vti_ *文件夹,因此我还将探讨for解决方案。


请以问题的形式改写;您是在开发工具中寻求帮助吗?还是想知道是否有这样的工具?
罗布

14
.bat文件不能解决所有Windows问题。有时您必须先用命令和内容填充它们。
授予

Answers:


139

类似于BlackTigerX的“ for”,我将建议

for /d /r . %d in (_svn) do @if exist "%d" rd /s/q "%d"


3
是的,因为此“ for”的性质是在递归目录树时将“ _svn”添加到每个目录条目。
JMD

1
尽管这个年龄超过2岁,但是您教给我一些新知识!谢谢。
瑞安·特尼尔

5
@DavidKEgghead,只需替换为“。” (当前目录)以及要搜索的目录。如果目标包含空格,请确保将其用引号引起来。因此,您将使用:for /d /r "D:\Projects" %d in (_svn) do @if exist "%d" rd /s/q "%d" 我经常通过用回声替换实际的“工作”来测试这些for /d /r "D:\Projects" %d in (_svn) do @if exist "%d" echo "%d"东西:这样我就可以知道我将要影响什么。
JMD

3
当我递归运行此命令时,有时会得到“目录不是空的”的信息,为什么呢?其背后的原因可能是什么?
SabareeshSS 2015年

5
如果要将其保存到bat文件中,请不要忘记将%替换为%%。
Jesper Mygind

33

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

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

第一部分以递归方式找到每个_svn文件夹。强制用于查找隐藏的文件夹。第二部分用于删除这些文件夹及其内容。Remove Commandlet带有方便的“ whatif”参数,该参数允许预览将要完成的操作。

PowerShell适用于Windows XP和Windows Vista。默认情况下,它存在于Windows 7和Windows Server 2008 R2中。

它是MS产品,是免费的,而且效果惊人!


该解决方案可在Windows Server 2008 R2上完美运行。谢谢
STT LCU 2013年

有谁知道“ whatif”参数的语法来预览将要做什么?
alias51

只需在行末添加“ -whatif”。这是删除,项目cmdlet的一种选择
塞德里克RUP

23

对于BATCH文件中的包含/调用,请使用(例如删除Debug和Release文件夹):

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

%批处理文件中需要double用作转义字符。否则,它报告语法错误。

谢谢。



10

在Windows中?如果您使用的是tortoiseSVN,则可以使用export命令导出不带.svn / _svn文件夹的项目副本。


1
无论您是否在Windows上,都可以使用命令行工具进行svn导出。
帕拉帕

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

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

此处...使用FreeCommander或TotalCommander

http://www.broobles.com/blog/posts/36

森达尼


1
作为TotalCommander(以前称为Windows Commander!)的长期用户,我不能让这个答案保持负面。对于已经安装TC的人来说,这是一个很棒的简单解决方案。我很高兴学会了这个漂亮的把戏。谢谢!
亚当·塔特尔

1
这里最直接的解决方案!
Amio.io 2014年

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.