Удалить пустые каталоги и каталоги, которые содержат только определенный файл (пакетный файл) - PullRequest
0 голосов
/ 26 марта 2012

Мне нужен командный файл, который удаляет все пустые каталоги и каталоги, которые содержат только определенный файл (.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

1 Ответ

1 голос
/ 26 марта 2012

Я был удивлен тем, как мало кода это занимает.Самым большим трюком является использование 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"
)

2-я версия немного изменена, если вы имели в виду "*.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"
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...