Website-Suche

3 Möglichkeiten, alle Dateien in einem Verzeichnis mit Ausnahme einer oder weniger Dateien mit Erweiterungen zu löschen


Manchmal kommen 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 mit Ausnahme von Dateien eines bestimmten Typs (der mit einer bestimmten Erweiterung endet) entfernen.

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

Bevor wir weitermachen, lassen Sie uns zunächst einen kurzen Blick auf ein wichtiges Konzept in Linux werfen – den Abgleich von Dateinamenmustern, der es uns ermöglicht, unser vorliegendes Problem zu lösen.

Empfohlene Lektüre: Verwenden Sie den Befehl find, um mehrere Dateinamen/Erweiterungen in Linux zu durchsuchen

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. ? – passt zu jedem 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 von 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, die durch das Zeichen | getrennt sind:

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

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

# shopt -s extglob

1. Um alle Dateien in einem Verzeichnis mit Ausnahme des Dateinamens 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 Sie alle Dateien außer allen .zip Dateien interaktiv entfernen können:

$ rm -i !(*.zip)

4. Als nächstes können Sie alle Dateien in einem Verzeichnis mit Ausnahme aller .zip und .odt Dateien wie folgt löschen, während Sie anzeigen, was gerade getan wird:

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

Sobald Sie alle erforderlichen Befehle haben, deaktivieren Sie die extglob-Shell-Option 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 entsprechenden Optionen oder in Verbindung mit dem Befehl xargs verwenden, indem wir eine Pipeline wie in den folgenden Formularen 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 mit Ausnahme der .gz-, .odt- und .jpg Dateien im aktuellen Verzeichnis:

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

Löschen von Dateien mit der Bash-Variablen GLOBIGNORE

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

Empfohlene Lektüre: Nützliche 12 praktische Beispiele für den grep-Befehl unter Linux

Um diese Methode zu verwenden, wechseln Sie in das Verzeichnis, das Sie bereinigen möchten, und setzen Sie dann die Variable GLOBIGNORE wie folgt:

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

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

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

$ rm -v *

Deaktivieren Sie anschließend die Variable GLOBIGNORE:

$ unset GLOBIGNORE

Hinweis: Um die Bedeutung der Flaggen zu verstehen, die in den obigen Befehlen verwendet werden, beziehen Sie sich auf die Handbuchseiten der einzelnen Befehle, die wir in den verschiedenen Abbildungen verwendet haben.

Das war's! Wenn Sie andere Befehlszeilentechniken für den gleichen Zweck im Sinn haben, vergessen Sie nicht, uns dies über unseren Feedback-Bereich unten mitzuteilen.

Verwandte Artikel: