
Wie kann ich alle .jpg
Dateien in einem Verzeichnisbaum finden und löschen, mit Ausnahme der Dateien, die „Sample“ im Dateinamen enthalten?
Zum Beispiel :
a.zip -> keep it
b.jpg -> delete it
a-sample.jpg -> keep it
b-Sample.jpg -> keep it
Antwort1
So löschen Sie alle Dateien mit der Endung . jpg
(ohne Berücksichtigung der Groß-/Kleinschreibung) außer Dateien mit sample
im Dateinamen (ohne Berücksichtigung der Groß-/Kleinschreibung):
find . ! -iname '*sample*' -iname '*.jpg' -delete
Dies durchläuft rekursiv alle Verzeichnisse im Baum, beginnend beim aktuellen Verzeichnis.
Wie es funktioniert:
.
Dies gibt an, dass wir mit dem aktuellen Verzeichnis beginnen.
! -iname '*sample*'
Dies weist an, alle Dateien mit in ihrem Namen
find
zu ignorieren . Das in macht diesen Test unabhängig von Groß- und Kleinschreibung.sample
i
-iname
-iname '*.jpg'
Diese Bedingung, die mit der vorherigen verknüpft ist, sucht nach Dateien mit der Endung
.jpg
.-delete
Dies weist Sie an
find
, alle derartigen Dateien zu löschen.
Bevor Sie den obigen Befehl ausführen, sollten Sie ihn testen. Führen Sie Folgendes aus:
find . ! -iname '*sample*' -iname '*.jpg'
Dadurch werden die gewünschten Dateien ausgedruckt. Wenn diese Liste in Ordnung ist, führen Sie den Befehl erneut mit -delete
angehängten Dateien aus.
Antwort2
In Bash können Sie verwenden
shopt -s extglob
So aktivieren Sie negative Übereinstimmungen:
rm !(*[Ss]ample*).jpg
Um auch Unterordner abzugleichen, aktivieren Sie
shopt -s globstar
und benutze den Doppelstern:
rm **/!(*[Ss]ample*).jpg