Видаліть усі файли певного типу (розширення) рекурсивно з каталогу за допомогою командного файлу


84

Мені потрібно видалити всі файли .jpg та .txt (наприклад) у dir1 та dir2.

Я спробував:

@echo off
FOR %%p IN (C:\testFolder D:\testFolder) DO FOR %%t IN (*.jpg *.txt) DO del /s %%p\%%t

У деяких довідниках це працювало; в інших - ні.

Наприклад, це нічого не зробило:

@echo off
FOR %%p IN (C:\Users\vexe\Pictures\sample) DO FOR %%t IN (*.jpg) DO del /s %%p\%%t

Чого мені не вистачає у другому фрагменті? Чому це не спрацювало?


Було б корисно, якби ви надали більше інформації про те , як саме це "не спрацювало". Чим фактичний результат відрізняється від очікуваного? Ви отримуєте повідомлення про помилку? Який?
Ansgar Wiechers

Відповіді:


202

Ви можете використовувати символи підстановки з delкомандою, і /Sробити це рекурсивно.

del /S *.jpg

Додаток

@BmyGuest запитав, чому заперечена відповідь ( del /s c:\*.blaawbg) нічим не відрізняється від моєї відповіді.

Існує величезна різниця між бігом del /S *.jpgта del /S C:\*.jpg. Перша команда виконується з поточного місця розташування , тоді як друга виконується на всьому диску .

У випадку, коли ви видаляєте jpgфайли за допомогою другої команди, деякі програми можуть перестати працювати, і в підсумку ви втратите всі свої сімейні фотографії. Це дуже дратує, але ваш комп’ютер все одно зможе працювати.

Однак, якщо ви працюєте над яким-небудь проектом і хочете видалити всі свої dllфайли myProject\dll, та запустіть такий командний файл:

@echo off

REM This short script will only remove dlls from my project... or will it?

cd \myProject\dll
del /S /Q C:\*.dll

Потім ви закінчите видалення всіх dllфайлів з вашого C:\диска. Всі ваші програми перестають працювати, ваш комп'ютер стає марним, і при наступній перезавантаженні ви телепортуєтеся в четвертий вимір, де будете застрягти на вічність.

Урок тут полягає в тому, щоб не запускати таку команду безпосередньо в корені диска (або в іншому місці, яке може бути небезпечним, наприклад %windir%), якщо ви можете цього уникнути. Завжди запускайте їх якомога локальніше.


3
додавання рядка pauseв кінці дозволить користувачеві побачити повну інформацію журналу.
КНУ

2
Дякую за додаток, Лаф. Я думаю, це допоможе іншим помітити цю справді важливу різницю.
BmyGuest

Якщо хто - небудь хоче , щоб видалити з певної директорії, ви можете комбінувати cdі delкоманди з `&» см stackoverflow.com/q/8055371/7429464
FindOutIslamNow

@FindOutIslamNow, або ви можете вказати повний шлях у delкоманді, не змінюючи поточний каталог.
Лаф,

Тільки невелике застереження щодо цього - це призведе до помилки, якщо файли для видалення не знайдені.
Джеймі Маршалл,

4

Нещодавно я написав пакетний сценарій, який дозволяє вибрати розширення файлу для видалення. Сценарій буде шукати в папці, в якій він знаходиться, та у всіх підпапках будь-який файл із таким розширенням та видаляти його.

@ECHO OFF
CLS

SET found=0
ECHO Enter the file extension you want to delete...
SET /p ext="> "

IF EXIST *.%ext% (           rem Check if there are any in the current folder :)
  DEL *.%ext%
  SET found=1
)
FOR /D /R %%G IN ("*") DO (  rem Iterate through all subfolders
  IF EXIST %%G CD %%G
  IF EXIST *.%ext% (
    DEL *.%ext%
    SET found=1
  )
)

IF %found%==1 (
  ECHO.
  ECHO Deleted all .%ext% files.
  ECHO.
) ELSE (
  ECHO.
  ECHO There were no .%ext% files.
  ECHO Nothing has been deleted.
  ECHO.
)

PAUSE
EXIT

Сподіваюся, це стане в нагоді всім, хто цього хоче :)


Як варіант, якщо у вас встановлений Bash (Cygwin, WSL тощо), тоді find . -name "*.ext" -type f -deleteпідійде просте (де ext - обране вами розширення).
Пірогліф

3

Ви можете використовувати це, щоб видалити ВСІ файли всередині папки та підпапок:

DEL "C:\Folder\*.*" /S /Q

Або скористайтеся цим, щоб видалити лише певні типи файлів:

DEL "C:\Folder\*.mp4" /S /Q 
DEL "C:\Folder\*.dat" /S /Q 

0

У мене недостатньо репутації, щоб додати коментар, тому я опублікував це як відповідь. Але для оригінальної проблеми з цією командою:

@echo off
FOR %%p IN (C:\Users\vexe\Pictures\sample) DO FOR %%t IN (*.jpg) DO del /s %%p\%%t

Перший For не має рекурсивного синтаксису, він повинен бути:

@echo off
FOR /R %%p IN (C:\Users\vexe\Pictures\sample) DO FOR %%t IN (*.jpg) DO del /s %%p\%%t

Ви можете просто зробити:

FOR %%p IN (C:\Users\0300092544\Downloads\Ces_Sce_600) DO @ECHO %%p

щоб показати фактичний випуск.


0

це воно:

@echo off

:: del_ext
call :del_ext "*.txt"
call :del_ext "*.png"
call :del_ext "*.jpg"

:: funcion del_ext
@echo off
pause
goto:eof
:del_ext
 set del_ext=%1
 del /f /q "folder_path\%del_ext%"
goto:eof

pd: замініть шлях_папки на вашу папку


-10

Якщо ви намагаєтесь видалити певні .extensions на диску C:, використовуйте цей cmd:

del /s c:\*.blaawbg

У мене був клієнт, який отримав вірус шифрування, і мені потрібно було знайти всі небажані файли та видалити їх.


13
Це здається жахливо небезпечним.
dudewad

5
Яка головна різниця між цією відповіддю (-2 голоси) та прийнятою (+42 голоси)?
BmyGuest

6
@BmyGuest Головна відмінність полягає в тому, що якщо ви виконаєте мою команду десь у підкаталозі, це вплине лише на файли, розташовані в цій підпапці. У цій відповіді ви видаляєте все, що відповідає імені файлу на всьому диску. Отже, якщо ви хочете видалити деякі файли dll у своєму проекті і помилково введете текст del /s c:\*.dll, то вас чекає дуже несподіваний сюрприз. Ніколи не запускайте такі команди на всьому накопичувачі, якщо це абсолютно не потрібно.
Лаф,

3
Я не думаю, що ця відповідь заслуговує на стільки голосів проти. Відповідь пояснює, що ця команда призначена для всього накопичувача (і чому). c:слід замінити потрібною папкою, якщо людина не хоче весь диск.
user1527152

2
Я думаю, що йому потрібно стільки голосів, якщо не більше, тому що він служить застереженням та попередженням про те, чого не робити. Ви дійсно можете зіпсувати речі, скопіювавши, вставивши та виконавши такий код. У баш вбудовано багато писанок, щоб викласти саме цей урок «безпечним» способом .. цей приклад може зіпсувати вам день. Найкраще!
jacktrader
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.