Website-Suche

3 Möglichkeiten, alle Dateien in einem Verzeichnis außer einer oder wenigen Dateien mit Erweiterungen zu löschen


Manchmal geraten Sie in eine Situation, in der Sie alle Dateien in einem Verzeichnis löschen oder einfach ein Verzeichnis bereinigen müssen, indem Sie alle Dateien außer Dateien eines bestimmten Typs (mit einer bestimmten Erweiterung enden) entfernen.

In diesem Artikel zeigen wir Ihnen, wie Sie mit den Befehlen rm, find und globignore Dateien in einem Verzeichnis löschen, mit Ausnahme bestimmter Dateierweiterungen oder -typen.

Bevor wir weitermachen, werfen wir zunächst einen kurzen Blick auf ein wichtiges Konzept in Linux – den Dateinamen-Musterabgleich, der es uns ermöglichen wird, unser vorliegendes Problem zu lösen.

Empfohlene Lektüre: Verwenden Sie den Befehl „find“, um unter Linux nach mehreren Dateinamen/Erweiterungen zu suchen

Unter Linux ist ein Shell-Muster eine Zeichenfolge, die aus den folgenden Sonderzeichen besteht, die als Platzhalter oder Metazeichen bezeichnet werden:

  1. * – entspricht null oder mehr Zeichen
  2. ? – entspricht einem beliebigen einzelnen Zeichen
  3. [seq] – entspricht jedem Zeichen in seq
  4. [!seq] – entspricht jedem Zeichen, das nicht in seq enthalten ist

Es gibt drei mögliche Methoden, die wir hier untersuchen werden, und dazu gehören:

Löschen Sie Dateien mit erweiterten Mustervergleichsoperatoren

Die verschiedenen erweiterten Mustervergleichsoperatoren sind unten aufgeführt, wobei pattern-list eine Liste ist, die einen oder mehrere Dateinamen enthält, getrennt durch das Zeichen |:

  1. *(pattern-list) – entspricht null oder mehr Vorkommen der angegebenen Muster
  2. ?(pattern-list) – entspricht null oder einem Vorkommen der angegebenen Muster
  3. +(Musterliste) – entspricht einem oder mehreren Vorkommen der angegebenen Muster
  4. @(pattern-list) – entspricht einem der angegebenen Muster
  5. !(pattern-list) – entspricht allem außer einem der angegebenen Muster

Um sie zu verwenden, aktivieren Sie die Shell-Option extglob wie folgt:

shopt -s extglob

1. Um alle Dateien in einem Verzeichnis außer Dateiname zu löschen, geben Sie den folgenden Befehl ein:

rm -v !("filename")

2. So löschen Sie alle Dateien mit Ausnahme von Dateiname1 und Dateiname2:

rm -v !("filename1"|"filename2") 

3. Das folgende Beispiel zeigt, wie alle Dateien außer allen .zip-Dateien interaktiv entfernt werden:

rm -i !(*.zip)

4. Als nächstes können Sie alle Dateien in einem Verzeichnis außer allen .zip- und .odt-Dateien wie folgt löschen und dabei anzeigen, was gerade passiert Erledigt:

rm -v !(*.zip|*.odt)

Sobald Sie über alle erforderlichen Befehle verfügen, deaktivieren Sie die Shell-Option extglob wie folgt:

shopt -u extglob

Löschen Sie Dateien mit dem Linux-Befehl „find“.

Bei dieser Methode können wir den Befehl „find“ ausschließlich mit den entsprechenden Optionen oder in Verbindung mit dem Befehl „xargs“ verwenden, indem wir eine Pipeline wie in den folgenden Formen verwenden:

find /directory/ -type f -not -name 'PATTERN' -delete
find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm {}
find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm [options] {}

5. Der folgende Befehl löscht alle Dateien außer .gz-Dateien im aktuellen Verzeichnis:

find . -type f -not -name '*.gz'-delete

6. Mit einer Pipeline und xargs können Sie den obigen Fall wie folgt ändern:

find . -type f -not -name '*gz' -print0 | xargs -0  -I {} rm -v {}

7. Schauen wir uns ein weiteres Beispiel an: Der folgende Befehl löscht alle Dateien außer .gz, .odt und .jpg-Dateien im aktuellen Verzeichnis:

find . -type f -not \(-name '*gz' -or -name '*odt' -or -name '*.jpg' \) -delete

Löschen Sie Dateien mit der Bash-GLOBIGNORE-Variable

Dieser letzte Ansatz funktioniert jedoch nur mit Bash. Hier speichert die Variable GLOBIGNORE eine durch Doppelpunkte getrennte Musterliste (Dateinamen), die bei der Pfadnamenerweiterung ignoriert werden soll.

Empfohlene Lektüre: Nützliche 12 praktische Beispiele zum Grep-Befehl unter Linux

Um diese Methode anzuwenden, wechseln Sie in das Verzeichnis, das Sie bereinigen möchten, und legen Sie dann die Variable GLOBIGNORE wie folgt fest:

cd test
GLOBIGNORE=*.odt:*.iso:*.txt

In diesem Fall werden alle Dateien außer den Dateien .odt, .iso und .txt aus dem aktuellen Verzeichnis entfernt.

Führen Sie nun den Befehl aus, um das Verzeichnis zu bereinigen:

rm -v *

Anschließend deaktivieren Sie die Variable GLOBIGNORE:

unset GLOBIGNORE

Hinweis: Um die Bedeutung der in den obigen Befehlen verwendeten Flags zu verstehen, sehen Sie sich die Manpages der einzelnen Befehle an, die wir in den verschiedenen Abbildungen verwendet haben.

Das ist alles! Wenn Sie für denselben Zweck andere Befehlszeilentechniken im Sinn haben, vergessen Sie nicht, uns diese über unseren Feedback-Bereich unten mitzuteilen.