Usuwanie wszystkich plików, które nie pasują do określonego wzorca - wiersz poleceń systemu Windows

12

Usuwanie elementów za pomocą wiersza polecenia jest dość łatwe.

del /options filename.extension

Załóżmy teraz, że chcę usunąć wszystkie pliki, które nie kończą się na .jpg w folderze, jak mam to zrobić.

Chodzi o to, że mam oprogramowanie, które konwertuje wszystkie określone obrazy do formatu .jpg, ale pozostawia oryginały, których już nie potrzebuję.

O wiele bardziej wydajne byłoby wykonanie pojedynczej instrukcji w porównaniu do wykonywania wielu instrukcji dla każdego rodzaju pliku.

KdgDev
źródło

Odpowiedzi:

14

Zrobiłbym to w ten sposób:

attrib +r *.jpg
del /q *
attrib -r *.jpg

Spowoduje to, że wszystkie pliki JPG będą tylko do odczytu, usunie wszystko inne (automatycznie pominie pliki tylko do odczytu), a następnie sprawi, że pliki JPG będą ponownie zapisywane.

Bobbymcr
źródło
Pracował jak mistrz. Uwaga: wystarczy dodać /sdo każdej linii, aby rekurencyjnie dołączyć pliki do podkatalogów.
Chuck Wilbur
9

To właściwie całkiem proste.

Musisz foriterować pliki, a następnie po prostu szukać rozszerzenia:

for %f in (*) do if not %~xf==.jpg del "%f"

powinien zrobić lewę (kod tutaj ).

Joey
źródło
dzięki, ale to samo zależy od używanej mapy.
KdgDev,
4
Mapa?
Joey
Jak powiedzieć, jeśli nie .jpg, a nie .jsp i nie .xml, a następnie del?
użytkownik1164061,
1

Powershell na ratunek
W czasach systemu Windows 7/8 jest to następca starej dobrej linii poleceń

Del C:\myFolder\* -exclude '*.jpg'

Deljest pseudonimem dla Remove-Item. Ma kilka opcji, takich jak rekurencja, włączanie, wykluczanie i filtrowanie (użyj tego dla RegEx)

Musisz dodać, \*aby dołączyć pliki do danego folderu

nixda
źródło
Z wiersza CMD powinno to działać:PowerShell.exe -Command "&{Remove-Item C:\MyFolder\* -Exclude '*.jpg'}"
Iszi
Uwaga: PowerShell jest dostarczany z Win 7/8. W przypadku systemu Windows XP lub Vista należy go pobrać i zainstalować.
Iszi
1

Wiem, że to nie odpowiada bezpośrednio na twoje pytanie, ale czy sprawdziłeś opcje konwertera, aby sprawdzić, czy:

  1. Może usunąć same oryginały

lub

  1. Zapisać plik .jpg w nowym folderze?
ChrisF
źródło
Nie mam bezpośredniej opcji, aby to zrobić. Spowoduje to zastąpienie oryginału, jeśli na początku był to plik JPG. Ale wszystkie pozostałe pozostają na dysku podczas tworzenia JPG z nich.
KdgDev
@WebDevHobo - no cóż, wybrałbym wtedy sugestię Johannesa.
ChrisF,
0

Szukałem sposobu, aby znaleźć wszystkie pliki, które NIE miały rozszerzenia „.mp3” w katalogu TREE na Windows 7 (wolumin NTFS) zawierającym może 20 000 plików w kilkuset katalogach o różnych głębokościach ... więc po odrobinie angst, użyłem:

cd <theplace>
dir /S | find /V "<DIR>" | find /V "Total" | find /V "bytes" | find /V "Directory" | find /V "Volume" | find /V ".mp3" | more /S

wyświetlało to pliki, które nie pasowały do ​​.mp3 po usunięciu wszystkiego, co jest związane z wyjściem polecenia DIR ... 99% działa ... chyba że plik, który nie pasuje, jest nazwany jednym ze słów kluczowych w standardowym wyjściu DIR - być może istnieje sposób na to, aby raport DIR zawierał mniej informacji o nagłówkach / podsumowaniach - ale nie zawracałem sobie głowy tym, ponieważ dostało się to w większości przypadków.

CaptPat
źródło
najwyraźniej kod wysyłający tutaj usuwa niektóre znaki specjalne ... więc powyższe polecenie „cd” znajdowało się w wierszu i określało docelowy katalog główny, a pierwsze polecenie „find” usunęło wszystkie wiersze zawierające „<” DIR ”> „(idź rysunek), ponieważ jest to wynik polecenia dir - ale kod pocztowy tutaj może pomyśleć, że jest to jakaś meta-instrukcja i usuwa ją ...
CaptPat
1
Jest na to znacznie łatwiejszy sposób: /bflaga dirpolecenia. dir /bwyświetli nazwy plików i rozszerzenia tylko w bieżącym katalogu, dir /s /bwyświetli w pełni kwalifikowane nazwy wszystkich plików w bieżącym i wszystkich podkatalogach. Pipowanie do find /vzamiast forpętli jest miłym akcentem, który muszę pamiętać, ale nie sądzę, żeby to działało del.
Bob
0

Inny sposób usuwania wszystkich plików pasujących do nazwy pliku pokazano poniżej. Lista pętli for zawiera wszystkie pliki, a jeśli NIE jest zgodne z nazwą pliku (bez nazwy katalogu).

for /r %f in (*) do if not %~nxf == abc.xml del "%f"
ajuffinger
źródło