我需要一个批处理文件,删除所有只包含特定文件(.svn)的空目录和目录。非常感谢您的帮助。
示例:
Folder1 -- folder conatins subfolders with some files, not remove
Folder2 -- empty folder, folder should be deleted
Folder3 -- folder contains only .svn, folder should be deleted
.svn
Folder4 -- folder contains subfolder with file, not remove
Folder41 -- folder contains some file, not remove
somefile.dat
Folder5 -- folder contains some file, not remove
.svn
somefile.dat
Folder6 -- folder contains empty subfolders, folder should be deleted
Folder61 -- folder contains only specific file, folder should be deleted
.svn
结果:
Folder1
Folder4
Folder41
somefile.dat
Folder5
.svn
somefile.dat
答案 0 :(得分:1)
我对这需要的代码很少感到惊讶。最大的诀窍是在SORT /R
的输出上使用DIR /B /S /AD
,以便在处理文件夹层次结构的父节点之前处理子节点。
我已经快速测试了代码,但请以安全的方式测试自己。
第1版假设".SVN"
是完整的文件名。
@echo off
setlocal disableDelayedExpansion
for /f "eol=: delims=" %%A in ('dir /b /s /ad ^| sort /r') do (
dir /b "%%A" | findstr /livx ".svn" >nul || rd /s /q "%%A"
)
如果您的意思是"*.SVN"
,第二个版本只会稍加修改。只更改了一个FINDSTR选项。
@echo off
setlocal disableDelayedExpansion
for /f "eol=: delims=" %%A in ('dir /b /s /ad ^| sort /r') do (
dir /b "%%A" | findstr /live ".svn" >nul || rd /s /q "%%A"
)
更新:2012-11-06
我刚刚意识到,如果非空文件夹名为.SVN
,则可以取消上述解决方案。代码应删除空文件夹或仅包含名为.SVN
的文件。如果文件夹包含名为.SVN
的非空文件夹,则不应删除该文件夹。
以下是第一个解决方案的修复:
@echo off
setlocal disableDelayedExpansion
for /f "eol=: delims=" %%A in ('dir /b /s /ad ^| sort /r') do (
dir /b "%%A"|findstr /livx ".svn" >nul||>nul 2>&1 dir /b /ad .svn||rd /s /q "%%A"
)
这是第二个解决方案的修复
@echo off
setlocal disableDelayedExpansion
for /f "eol=: delims=" %%A in ('dir /b /s /ad ^| sort /r') do (
dir /b "%%A"|findstr /live ".svn" >nul||>nul 2>&1 dir /b /ad *.svn||rd /s /q "%%A"
)