Usuń wszystkie pliki określonego typu (rozszerzenia) rekurencyjnie w dół katalogu przy użyciu pliku wsadowego

86

Muszę usunąć wszystkie pliki .jpg i .txt (na przykład) w dir1 i dir2.

Próbowałem:

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

W niektórych katalogach to działało; w innych nie.

Na przykład to nic nie dało:

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

Czego brakuje mi w drugim fragmencie? Dlaczego to nie zadziałało?

vexe
źródło
Pomogłoby, gdybyś podał więcej informacji o tym , jak dokładnie to „nie działa”. Czym rzeczywisty wynik różni się od oczekiwanego? Czy otrzymujesz komunikat o błędzie? Który?
Ansgar Wiechers

Odpowiedzi:

208

Możesz używać symboli wieloznacznych z del poleceniem i /Srobić to rekurencyjnie.

del /S *.jpg

Uzupełnienie

@BmyGuest zapytał, dlaczego negatywna odpowiedź ( del /s c:\*.blaawbg) różni się od mojej odpowiedzi.

Istnieje ogromna różnica między bieganiem del /S *.jpga del /S C:\*.jpg. Pierwsze polecenie jest wykonywane z bieżącej lokalizacji , a druga na całym dysku .

W scenariuszu, w którym usuwasz jpg pliki za pomocą drugiego polecenia, niektóre aplikacje mogą przestać działać, co spowoduje utratę wszystkich zdjęć rodzinnych. Jest to bardzo irytujące, ale komputer nadal będzie mógł działać.

Jeśli jednak pracujesz nad jakimś projektem i chcesz usunąć wszystkie swoje dllpliki myProject\dlli uruchomić następujący plik wsadowy:

@echo off

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

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

W końcu usuwasz wszystko dll pliki z C:\dysku. Wszystkie twoje aplikacje przestają działać, twój komputer staje się bezużyteczny, a przy następnym restarcie zostajesz teleportowany do czwartego wymiaru, gdzie utkniesz na wieczność.

Lekcja tutaj nie polega na uruchamianiu takiego polecenia bezpośrednio w katalogu głównym dysku (lub w innym miejscu, które może być niebezpieczne, na przykład %windir%), jeśli można tego uniknąć. Zawsze uruchamiaj je tak lokalnie, jak to możliwe.

Dodatek 2

Metoda wieloznaczna spróbuje dopasować wszystkie nazwy plików w formacie 8.3 i formacie „długiej nazwy”. Na przykład *.dlldopasuje project.dll i project.dllold , co może być zaskakujące. Zobacz tę odpowiedź w SU, aby uzyskać bardziej szczegółowe informacje.

Laf
źródło
3
dołączenie linii pausena końcu pozwoli użytkownikowi zobaczyć pełne informacje dziennika.
KNU
2
Dzięki za uzupełnienie, Laf. Myślę, że pomoże to innym dostrzec tę istotną różnicę.
BmyGuest
Jeśli ktoś chce usunąć z określonego cddel
katalogu
@FindOutIslamNow lub możesz określić pełną ścieżkę w delpoleceniu bez konieczności zmiany bieżącego katalogu.
Laf
1
Zauważyłem, że kiedy to robię, usuwa wszelkie rozszerzenia plików, które zaczynają się od określonego. Na przykład, jeśli mam .jsxpliki i .jsxbinpliki w folderze i używam del /S *.jsx, usuwa również .jsxbinpliki. Umieszczanie cytatów *.jsxniczego nie zmieniło. Czy istnieje sposób, aby wymusić usunięcie plików z dokładnie określonym rozszerzeniem?
Marty
4

Niedawno napisałem skrypt wsadowy, który pozwala wybrać rozszerzenie pliku do usunięcia. Skrypt przeszuka folder, w którym się znajduje, oraz wszystkie podfoldery dla dowolnego pliku z tym rozszerzeniem i usunie go.

@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

Mam nadzieję, że przyda się to każdemu, kto tego chce :)

Piroglif
źródło
Alternatywnie, jeśli masz zainstalowany Bash (Cygwin, WSL itp.), Wystarczy proste find . -name "*.ext" -type f -delete(gdzie ext to wybrane rozszerzenie).
Pyroglyph
3

Możesz użyć tego, aby usunąć WSZYSTKIE pliki w folderze i podfolderach:

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

Lub użyj tego, aby usunąć tylko określone typy plików:

DEL "C:\Folder\*.mp4" /S /Q 
DEL "C:\Folder\*.dat" /S /Q 
StackBuck
źródło
0

Nie mam wystarczającej reputacji, aby dodać komentarz, więc opublikowałem to jako odpowiedź. Ale w przypadku oryginalnego problemu z tym poleceniem:

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

W pierwszym For brakuje rekurencyjnej składni, powinno to być:

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

Możesz po prostu:

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

aby pokazać rzeczywisty wynik.

The Long Nguyen
źródło
0

to jest to:

@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: zamień folder_path na swój folder

ajcg
źródło
-9

Jeśli próbujesz usunąć pewne rozszerzenia z dysku C:, użyj tego polecenia cmd:

del /s c:\*.blaawbg

Miałem klienta, który dostał wirusa szyfrującego i musiałem znaleźć wszystkie niepotrzebne pliki i je usunąć.

Tommy Mosher
źródło
13
Wydaje się to przerażająco niebezpieczne.
dudewad
6
Jaka jest główna różnica między tą odpowiedzią (-2 głosy) a zaakceptowaną (+42 głosy)?
BmyGuest,
6
@BmyGuest Główną różnicą jest to, że jeśli wykonasz moje polecenie gdzieś w podfolderze, wpłynie to tylko na pliki znajdujące się w tym podfolderze. W tej odpowiedzi usuwasz wszystko , co pasuje do nazwy pliku na całym dysku. Więc jeśli chciałeś usunąć niektóre pliki dll ze swojego projektu i omyłkowo wpisałeś del /s c:\*.dll, to czeka Cię bardzo poważna niespodzianka. Nigdy nie uruchamiaj takich poleceń na całym dysku, chyba że jest to absolutnie konieczne.
Laf
3
Myślę, że ta odpowiedź nie zasługuje na tak wiele głosów przeciw. Odpowiedź wyjaśnia, że ​​to polecenie dotyczy całego dysku (i dlaczego). c:należy zastąpić żądanym folderem, jeśli dana osoba nie chce całego dysku.
user1527152
2
Myślę, że potrzebuje tylu głosów przeciw, jeśli nie więcej, ile służy jako zrzeczenie się i ostrzeżenie, czego nie robić. Możesz naprawdę zepsuć wszystko, kopiując, wklejając i wykonując taki kod. Istnieje wiele pisanek wbudowanych w bash, aby uczyć tej lekcji w „bezpieczny” sposób. Ten przykład może zrujnować twój dzień. Najlepsza!
jacktrader