(Пакетно) Как рекурсивно удалить все файлы / папки в каталоге, кроме тех, которые с лидирующей.? - PullRequest
0 голосов
/ 14 мая 2018

У меня есть каталог, src. Я хочу рекурсивно удалить все его содержимое, кроме файлов (.gitignore, ...) и папок (.git, .vscode, ...), имена которых начинаются с .. Соответствие этому шаблону в подкаталогах не является ни необходимым, ни вредным.

Какой самый чистый способ сделать это в командном файле?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"

:: step 1 : delete all files NOT starting "."

FOR /f "tokens=1*delims=" %%a IN (
 'dir /s /b /a-d "%sourcedir%\*" '
 ) DO (
 ECHO %%~nxa|FINDSTR /b /L "." >nul
 IF ERRORLEVEL 1 ECHO(DEL "%%a"
)

:: step 2 : delete all directories NOT starting "."

FOR /f "tokens=1*delims=" %%a IN (
 'dir /s /b /ad "%sourcedir%\*" ^|sort /r'
 ) DO (
 ECHO %%~nxa|FINDSTR /b /L "." >nul
 IF ERRORLEVEL 1 ECHO(RD "%%a"
)
GOTO :EOF

Вам потребуется изменить настройку sourcedir в соответствии с вашими обстоятельствами.

Требуемые команды DEL просто ECHO отредактированы для целей тестирования. После того, как вы убедились, что команды верны , измените ECHO(DEL на DEL, чтобы фактически удалить файлы.

Необходимые команды RD просто ECHO отредактированы для целей тестирования, После того, как вы убедились, что команды правильные , измените ECHO(RD на RD, чтобы фактически удалить каталоги.

для каждого имени файла во всем поддереве, посмотрите, начинается ли оно с., если для errorlevel задано значение, отличное от 0, и, следовательно, удалить файл.

После того, как это будет сделано, повторите операцию с именами каталогов, но сортируйте найденные имена в обратном порядке, чтобы подкаталог именилюбой каталог появится перед именем каталога. Попытка удалить каталог с rd - он останется, если он содержит файлы или подкаталоги (которые неявно начнутся .).Добавьте 2>nul к строке rd для подавления сообщений об ошибках (каталог не может быть удален, поскольку он все еще содержит файлы / подкаталоги)

0 голосов
/ 14 мая 2018

Попробуйте исключить папки с лидирующей точкой (для каждой папки):

for /f "tokens=*eol=." %%A in ('dir /B /AD') do Echo=%%A

Это не влияет на имена папок, содержащие точки в других позициях.

Относительномедленный вариант, повторяющий все папки и использующий findstr для фильтрации всех папок, содержащих \., оба символа необходимо экранировать с обратной косой чертой

for /r /D %%A in (*) do @echo %%A|findstr /V "\\\."
...