0

我有带有子目录的目录

C:\temp
├───.svn
│   └───gg
├───common
│   ├───.svn
│   │   └───fff
│   └───ggggg
└───todel
    ├───gffgf
    └───jhj

我需要清理c:\temp,但保留.svn文件夹的内容而不进行修改。下面描述的方法不适用于子目录(在我的情况下为 common.svn)我希望得到以下结构

C:.
├───.svn
│   └───gg
└───common
    └───.svn
        └───fff

删除所有文件和文件夹但排除目录 批处理方法概述也没有给出结果,因为cmd rd命令在父文件夹删除期间也不是不知道子目录。我已经完成了以下操作: 删除所有文件夹,除了.... (*.BAT) 执行 del 批处理文件时排除 temp 内的文件夹

4

4 回答 4

2

如果你正确使用递归调用,它只需要很少的代码。

小心这个脚本!如果使用不当,可能会造成伤害。

该脚本不得驻留在要“清理”的根层次结构中。

当前目录不能是要删除的文件夹之一。

如所写,该脚本不考虑隐藏、系统或只读文件或文件夹。

清除.BAT

@echo off
setlocal disableDelayedExpansion
if /i "%~nx1" equ ".svn" exit /b 1
del /q "%~1.\*"
set "keep=0"
for /d %%F in ("%~1.\*") do call "%~f0" "%%~fF" && rd "%%F" || set "keep=1"
exit /b %keep%

编辑:代码已经过编辑,可以在以下所有用例中正常工作:(假设当前目录是“c:\test”)

purge.bat "c:\temp"
purge.bat "c:\temp\"
purge.bat "d:\"
purge.bat "d:"

请参阅如何安全地将文件名附加到 Windows 文件夹路径参数?了解更多信息。

于 2014-10-29T21:34:46.570 回答
1
@echo off
setlocal EnableDelayedExpansion

rem Traverse the tree in top-down order and get subdirectories that could be deleted
set tos=0
for /D /R "C:\temp" %%a in (*) do (
   set "subdir=%%a"
   if "!subdir:\.svn=!" equ "%%a" (
      set /A tos+=1
      set "stack[!tos!]=%%a"
   )
)

rem Process subdirectories in opposite (bottom-up) order
for /L %%i in (%tos%,-1,1) do (
   rem Delete all files in the subdirectory
   del /Q "!stack[%%i]!\*.*"
   rem And remove the subdirectory if it becomes empty
   rd "!stack[%%i]!" 2>NUL
)
于 2014-10-29T19:49:59.143 回答
1
@echo off
    setlocal enableextensions disabledelayedexpansion

    set "folder=c:\temp"

    rem Temporary files
    set "folderList=%temp%\%~nx0.folder.tmp"
    set "SVNList=%temp%\%~nx0.svn.tmp"
    set "notSVNList=%temp%\%~nx0.notsvn.tmp"

    rem Retrieve the list of all folders
    dir /s /ad /b "%folder%\*" | sort > "%folderList%"

    rem Retrieve the list of svn folders
    findstr /i /r /c:"\\\.svn[\\]" /c:"\\\.svn$" "%folderList%" > "%SVNList%"

    rem Retrieve the list of not svn folders
    findstr /v /i /r /c:"\\\.svn[\\]" /c:"\\\.svn$" "%folderList%" > "%notSVNList%"

    rem For each folder not in svn list
    for /f "usebackq delims=" %%a in ("%notSVNList%") do (
        rem If the folder exist test if it is a parent of a svn folder 
        rem If it is a parent delete its contents else remove the folder
        if exist "%%a" findstr /l /b /c:"%%a\\" "%SVNList%" >nul && ( 
            del /q "%%a\*" 
        ) || ( 
            rd /s /q "%%a" 
        )
    )

    rem Remove remaining files in starting folder
    del /q "%folder%\*" >nul 2>nul 

    rem Remove temporary files
    del /q "%folderList%" >nul 2>nul 
    del /q "%SVNList%" >nul 2>nul 
    del /q "%notSVNList%" >nul 2>nul 
于 2014-10-29T09:41:00.063 回答
0

未经测试,但这样的事情应该可以工作:

svn move temp\* .
svn delete temp
于 2014-10-29T07:39:16.830 回答