Löschen aller Dateien, die nicht einem bestimmten Muster entsprechen - Windows-Befehlszeile

12

Das Löschen von Elementen über die Befehlszeile ist ziemlich einfach.

del /options filename.extension

Angenommen, ich möchte alle Dateien löschen, die nicht mit .jpg in einem Ordner enden. Wie würde ich das tun?

Die Sache ist, ich habe eine Software, die alle angegebenen Bilder in .jpg konvertiert, aber die Originale hinterlässt, die ich nicht mehr brauche.

Es wäre viel effizienter, eine einzelne Anweisung auszuführen, als mehrere Anweisungen für jeden unterschiedlichen Dateityp auszuführen.

KdgDev
quelle

Antworten:

14

Ich würde es so machen:

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

Dadurch werden zuerst alle JPG-Dateien schreibgeschützt, alle anderen Dateien werden gelöscht (schreibgeschützte Dateien werden automatisch übersprungen) und die JPG-Dateien werden dann wieder beschreibbar.

bobbymcr
quelle
Arbeitete wie ein Champion. Hinweis: Fügen Sie einfach /szu jeder Zeile hinzu, um Dateien rekursiv in Unterverzeichnisse aufzunehmen.
Chuck Wilbur
9

Das ist eigentlich ziemlich einfach.

Sie müssen fordie Dateien durchlaufen und dann einfach nach der Erweiterung suchen:

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

sollte den Trick machen (Code hier ).

Joey
quelle
Danke, aber das allein hängt davon ab, welche Karte ich benutze.
KdgDev
4
Karte?
Joey
Wie sage ich, wenn nicht .jpg und nicht .jsp und nicht .xml, dann del?
user1164061
1

Powershell zur Rettung
In Zeiten von Windows 7/8 ist es der Nachfolger der guten alten Kommandozeile

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

Delist ein Alias ​​für Remove-Item. Es gibt verschiedene Optionen wie Rekursion, Einschließen, Ausschließen und Filtern (verwenden Sie diese Option für RegEx).

Sie müssen hinzufügen \*, um Dateien in einen bestimmten Ordner aufzunehmen

Nixda
quelle
Von der CMD-Eingabeaufforderung sollte dies funktionieren:PowerShell.exe -Command "&{Remove-Item C:\MyFolder\* -Exclude '*.jpg'}"
Iszi
Hinweis: PowerShell wird mit Win 7/8 geliefert. Für Windows XP oder Vista müssen Sie es herunterladen und installieren.
Iszi
1

Ich weiß, dass Ihre Frage nicht direkt beantwortet wird, aber haben Sie sich die Optionen Ihres Konverters angesehen, um festzustellen, ob:

  1. Es kann die Originale selbst löschen

oder

  1. Schreiben Sie die .jpg's in einen neuen Ordner?
ChrisF
quelle
Ich habe nicht die direkte Möglichkeit dazu. Was es tun wird, ist das Original zu überschreiben, wenn dies zunächst ein JPG war. Alle anderen bleiben jedoch auf der Festplatte, während ein JPG von ihnen erstellt wird.
KdgDev
@WebDevHobo - na ja, dann würde ich dem Vorschlag von Johannes folgen.
ChrisF
0

Ich suchte nach einer Möglichkeit, alle Dateien, die NICHT die Erweiterung ".mp3" hatten, in einem Verzeichnis TREE unter Windows 7 (NTFS-Volume) zu finden, das vielleicht 20.000 Dateien in mehreren hundert Verzeichnissen unterschiedlicher Tiefe enthält ... also nach einer Weile Angst, ich benutzte:

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

Hier wurden die Dateien aufgelistet, die nicht mit der MP3-Datei übereinstimmten, nachdem alle mit der DIR-Befehlsausgabe verbundenen Elemente entfernt wurden. 99% funktionieren ... es sei denn, die nicht übereinstimmende Datei wird als eines der Schlüsselwörter in der Standard-DIR-Ausgabe bezeichnet. Vielleicht gibt es eine Möglichkeit, DIR-Berichte weniger Header- / Zusammenfassungsinformationen zu machen - aber ich habe mich nicht darum gekümmert, da dies den größten Teil des Weges dorthin führte.

CaptPat
quelle
Anscheinend entfernt die Postleitzahl hier einige Sonderzeichen ... also befand sich der obige Befehl "cd" in einer eigenen Zeile und gab das Zielstammverzeichnis an, und der erste Befehl "find" entfernte alle Zeilen, die "<" DIR "> enthielten "(siehe Abbildung), da dies die Ausgabe des Befehls dir ist - aber die Postleitzahl hier könnte denken, dass dies eine Art Meta-Anweisung ist, und entfernt sie ...
CaptPat
1
Es gibt einen viel einfacheren Weg, dies zu tun: das /bFlag des dirBefehls. dir /blistet Dateinamen und Erweiterungen nur im aktuellen Verzeichnis auf, dir /s /blistet die vollständig qualifizierten Namen aller Dateien im aktuellen und allen Unterverzeichnissen auf. In den Rohrleitungen find /vstatt einer forSchleife ist eine nette Geste Ich erinnere mich , müssen würde, aber ich glaube nicht , es funktioniert mit del.
Bob
0

Eine andere Möglichkeit, alle Dateien zu löschen, die einem Dateinamen entsprechen, ist unten dargestellt. Die for-Schleifenliste enthält alle Dateien und die if NOT-Übereinstimmungen nach Dateiname (ohne Verzeichnisnamen).

for /r %f in (*) do if not %~nxf == abc.xml del "%f"
Ajuffinger
quelle