2014-10-29 16 views
0

У меня есть каталог с подкаталогамиОчистить каталог, но исключить подкаталог

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

мне нужно очистить c:\temp, но оставить .svn папки с его содержимым без изменений. подход, описанный ниже, не работает subudirectories (common.svn в моем случае) Я хотел бы получить следующую структуру в результате

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

Delete all files and folders but exclude a directory Batch подходы Обзор также не дали результатов поскольку команда cmd rd также не знает о подкаталогах во время удаления родительской папки. Я прошел через следующее: Delete all folders except.... (*.BAT) Exclude a folder inside temp when executing a del batch file

+0

Вы всегда можете просто переместить вложенные папки в корневой каталог, а затем удалить temp – atlanteh

ответ

0

не проверял, но что-то, как это должно работать:

svn move temp\* . 
svn delete temp 
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 
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 
) 
2

Это занимает удивительно мало кода, если вы используете рекурсивные вызовы правильно ,

Будьте осторожны с этим скриптом! Он может нанести вред, если его неправильно использовать.

Сценарий не должен находиться в корневой иерархии, которая должна быть «очищена».

Текущий каталог не должен быть одной из папок, которые необходимо удалить.

Как написано, сценарий не учитывает файлы или папки Hidden, System или ReadOnly.

PURGE.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% 

EDIT: Код был отредактирован, чтобы правильно работать со всеми из случаев после использования: (Предположим, что текущий каталог является "C: \ тест")

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

См. How to safely append a file name to a Windows folder path argument? для получения дополнительной информации.

Смежные вопросы