Вопрос или проблема
У меня много файлов в D:\cert
, которые я хочу удалить, но также хочу сохранить некоторые файлы с определенным текстом в названии – как мне удалить все *.pdf
файлы, но оставить *_sign.pdf
и все подпапки?
-
20241220cert.pdf 20241220cert_sign.pdf 20241221cert.pdf 20241221cert_sign.pdf 20241222cert.pdf 20241222cert_sign.pdf
Пример после выполнения скрипта удаления:
-
20241220cert_sign.pdf 20241221cert_sign.pdf 20241222cert_sign.pdf
Команда IF
не понимает подстановочные символы для сопоставления. Вместо этого вам нужно использовать подстроки, чтобы извлечь часть, которую вы хотите сопоставить. Если вы вставите код ниже в файл .CMD
или .BAT
, он должен сделать то, что вы просите.
@echo off
for /F %%g in ('dir /s /b *.pdf') do call :sub %%g
goto :eof
:sub
set filename=%1
set extension=%filename:~-9%
if [%extension%] NEQ [_sign.pdf] del %filename%
exit /b
Я настоятельно рекомендую добавить в закладки ss64.com; это отличная справка по WinBatch, PowerShell, bash на MacOS и bash на Linux.
Хотя это не было слишком трудно разобраться в WinBatch, мое предпочтение на самом деле было бы сделать это в PowerShell, который имеет лучшую обработку/сопоставление строк и более мощный конвейер, что позволяет сделать это в виде ‘одной строки’:
Get-ChildItem -Recurse *.pdf | Where-Object {$_.Name -NotLike "*_sign*"} | Remove-Item
Нет прямой команды, но вы можете легко сделать это, переместив те, которые хотите сохранить, в другое место. Запустите это после входа в директорию, где находятся файлы. Я бы предложил запускать одну команду за раз, чтобы убедиться, что все работает так, как вы ожидаете.
mkdir xtemp
move *_sign.pdf xtemp\
del *.pdf
move xtemp\*.* .
rmdir xtemp
Это
- Создает новую директорию с именем xtemp
- Перемещает файлы для сохранения в эту директорию
- Удаляет нежелательные файлы
- Перемещает сохраненные файлы обратно
- Удаляет директорию.
Обратите внимание, если что-то пойдет не так при перемещении из xtemp, rmdir
не удалит директорию, так как она не будет пустой.
Ответ или решение
Для удаления файлов с расширением .pdf в директории D:\cert, при этом сохраняя файлы содержащие "_sign" в названии, вам подходят два подходящих варианта: использование командной строки Windows или PowerShell.
Подход 1: Использование командной строки
Вы можете создать .BAT или .CMD файл с следующим кодом:
@echo off
for /F %%g in ('dir /s /b D:\cert\*.pdf') do call :sub %%g
goto :eof
:sub
set filename=%1
set extension=%filename:~-9%
if [%extension%] NEQ [_sign.pdf] del "%filename%"
exit /b
Объяснение кода:
- @echo off: Отключает вывод команд на экран.
- for /F %%g in (‘dir /s /b D:\cert*.pdf’): Находит все .pdf файлы во всех подкаталогах, передавая их по одному в
:sub
. - call :sub %%g: Вызывает метку
:sub
, передавая найденный файл как аргумент. - if [%extension%] NEQ [_sign.pdf]: Проверяет, не содержит ли имя файла "_sign" в конце, чтобы не удалить его.
- del "%filename%": Удаляет файл, если условие истинно.
Подход 2: Использование PowerShell
PowerShell предоставляет более мощные средства для работы с файлами и может сделать это в одной строке:
Get-ChildItem -Path "D:\cert" -Recurse -Filter "*.pdf" | Where-Object { $_.Name -notlike "*_sign*" } | Remove-Item
Объяснение команды:
- *Get-ChildItem -Path "D:\cert" -Recurse -Filter ".pdf"**: Находит все PDF файлы в указанной директории и её подкаталогах.
- Where-Object { $_.Name -notlike "_sign" }: Фильтрует файлы, оставляя только те, которые не содержат "_sign" в имени.
- Remove-Item: Удаляет фильтрованные файлы.
Дополнительный метод: Временное перемещение файлов
Если вы хотите быть абсолютно уверенными в том, что нужные файлы не будут удалены, можете использовать временное перемещение:
mkdir D:\cert\xtemp
move D:\cert\*_sign.pdf D:\cert\xtemp\
del D:\cert\*.pdf
move D:\cert\xtemp\* D:\cert\
rmdir D:\cert\xtemp
Сводная информация о процессе:
- mkdir D:\cert\xtemp: Создает временную папку.
- move D:\cert*_sign.pdf D:\cert\xtemp\: Перемещает файлы с "_sign" в временную папку.
- del D:\cert*.pdf: Удаляет все оставшиеся PDF файлы.
- move D:\cert\xtemp* D:\cert\: Перемещает сохраненные файлы обратно.
- rmdir D:\cert\xtemp: Удаляет временную папку.
Заключение
Оба метода позволяют эффективно удалить ненужные .pdf файлы, при этом сохранив необходимые. Выбор между ними зависит от предпочтений: командной строки или PowerShell. Рекомендуется протестировать каждую команду перед полномасштабным использованием, чтобы избежать нежелательного удаления файлов.
Также большую роль в поддержании чистоты и организации файлов в системе играет регулярная проверка и удаление устаревших или ненужных документов. Это позволит оптимизировать работу с файлами и повысить общую эффективность системы.