So löschen Sie rekursiv alle JPG-Dateien, behalten aber die, die „Sample“ enthalten

So löschen Sie rekursiv alle JPG-Dateien, behalten aber die, die „Sample“ enthalten

Wie kann ich alle .jpgDateien 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 sampleim 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 findzu ignorieren . Das in macht diesen Test unabhängig von Groß- und Kleinschreibung.samplei-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 -deleteangehä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

verwandte Informationen