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

86

Мне нужно удалить все файлы .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

Что мне не хватает во втором фрагменте? Почему не сработало?

раздражать
источник
Было бы полезно, если бы вы предоставили больше информации о том , как именно это «не сработало». Чем фактический результат отличается от ожидаемого? Вы получаете сообщение об ошибке? Который?
Ансгар Вичерс

Ответы:

208

Вы можете использовать подстановочные знаки с 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%), если вы можете этого избежать. Всегда запускайте их как можно более локально.

Приложение 2

Метод подстановочных знаков будет пытаться сопоставить все имена файлов в их формате 8.3 и их формате «длинных имен». Например, *.dllсовпадет project.dll и project.dllold , что может удивить. См. Этот ответ на SU для получения более подробной информации.

Laf
источник
3
добавление строки pauseв конце позволит пользователю увидеть полную информацию журнала.
KNU
2
Спасибо за добавление, Лаф. Я думаю, это поможет другим заметить это действительно важное отличие.
BmyGuest
Если кто - нибудь хочет , чтобы удалить из определенной директории, вы можете комбинировать cdи delкоманды с `&» см stackoverflow.com/q/8055371/7429464
FindOutIslamNow
@FindOutIslamNow или вы можете указать полный путь в delкоманде, не меняя текущий каталог.
Laf
1
Я заметил, что когда я это делаю, он удаляет любое расширение файла, которое начинается с указанного. Например, если у меня есть .jsxфайлы и .jsxbinфайлы в папке и я использую del /S *.jsx, он также удаляет .jsxbinфайлы. Размещение кавычек *.jsxничего не изменило. Есть ли способ заставить его удалять файлы с точно указанным расширением?
Марти
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 - ваше выбранное расширение).
Pyroglyph
3

Вы можете использовать это для удаления ВСЕХ файлов внутри папки и подпапок:

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

Или используйте это для удаления только определенных типов файлов:

DEL "C:\Folder\*.mp4" /S /Q 
DEL "C:\Folder\*.dat" /S /Q 
StackBuck
источник
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: замените folder_path своей папкой

ajcg
источник
-9

Если вы пытаетесь удалить определенные расширения .extensions на диске C :, используйте этот cmd:

del /s c:\*.blaawbg

У меня был клиент, у которого был вирус шифрования, и мне нужно было найти все ненужные файлы и удалить их.

Томми Мошер
источник
13
Это кажется ужасающе небезопасным.
dudewad
6
В чем главное отличие этого ответа (-2 голоса) от принятого (+42 голоса)?
BmyGuest 08
6
@BmyGuest Главное отличие в том, что если вы выполните мою команду где-то в подпапке, это повлияет только на файлы, расположенные в этой подпапке. В этом ответе вы удаляете все, что соответствует имени файла на всем диске. Так что, если вы хотите удалить некоторые файлы DLL в своем проекте и ошибочно del /s c:\*.dllнабираете текст , вас ждет очень неприятный сюрприз. Никогда не запускайте такие команды на всем диске без крайней необходимости.
Laf
3
Я не думаю, что этот ответ заслуживает стольких отрицательных оценок. Ответ объясняет, что эта команда предназначена для всего диска (и почему). c:следует заменить на желаемую папку, если человеку не нужен весь диск.
user1527152
2
Я думаю, что для этого нужно столько же голосов против, если не больше, поскольку это служит отказом от ответственности и предупреждением о том, чего не следует делать. Вы действительно можете все испортить, копируя, вставляя и выполняя такой код. В bash встроено множество пасхальных яиц, чтобы преподать этот урок "безопасным" способом ... этот пример может испортить вам день. Лучший!
jacktrader