Какую команду можно использовать для удаления файлов, но сохранить файлы с определённым текстом в названии?

Вопрос или проблема

У меня много файлов в 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

Объяснение кода:

  1. @echo off: Отключает вывод команд на экран.
  2. for /F %%g in (‘dir /s /b D:\cert*.pdf’): Находит все .pdf файлы во всех подкаталогах, передавая их по одному в :sub.
  3. call :sub %%g: Вызывает метку :sub, передавая найденный файл как аргумент.
  4. if [%extension%] NEQ [_sign.pdf]: Проверяет, не содержит ли имя файла "_sign" в конце, чтобы не удалить его.
  5. del "%filename%": Удаляет файл, если условие истинно.

Подход 2: Использование PowerShell

PowerShell предоставляет более мощные средства для работы с файлами и может сделать это в одной строке:

Get-ChildItem -Path "D:\cert" -Recurse -Filter "*.pdf" | Where-Object { $_.Name -notlike "*_sign*" } | Remove-Item

Объяснение команды:

  1. *Get-ChildItem -Path "D:\cert" -Recurse -Filter ".pdf"**: Находит все PDF файлы в указанной директории и её подкаталогах.
  2. Where-Object { $_.Name -notlike "_sign" }: Фильтрует файлы, оставляя только те, которые не содержат "_sign" в имени.
  3. 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

Сводная информация о процессе:

  1. mkdir D:\cert\xtemp: Создает временную папку.
  2. move D:\cert*_sign.pdf D:\cert\xtemp\: Перемещает файлы с "_sign" в временную папку.
  3. del D:\cert*.pdf: Удаляет все оставшиеся PDF файлы.
  4. move D:\cert\xtemp* D:\cert\: Перемещает сохраненные файлы обратно.
  5. rmdir D:\cert\xtemp: Удаляет временную папку.

Заключение

Оба метода позволяют эффективно удалить ненужные .pdf файлы, при этом сохранив необходимые. Выбор между ними зависит от предпочтений: командной строки или PowerShell. Рекомендуется протестировать каждую команду перед полномасштабным использованием, чтобы избежать нежелательного удаления файлов.

Также большую роль в поддержании чистоты и организации файлов в системе играет регулярная проверка и удаление устаревших или ненужных документов. Это позволит оптимизировать работу с файлами и повысить общую эффективность системы.

Оцените материал
Добавить комментарий

Капча загружается...