So löschen Sie Dateien in einem Verzeichnis mit Ausnahme einiger Erweiterungen
Manchmal befinden Sie sich in einer Situation, in der Sie alle Dateien in einem Verzeichnis löschen oder einfach ein Verzeichnis aufräumen müssen, indem Sie alle Dateien entfernen, mit Ausnahme derjenigen mit einer bestimmten Erweiterung (z. B. Dateien, die auf einen bestimmten Typ enden).
In diesem Artikel zeigen wir Ihnen, wie Sie Dateien in einem Verzeichnis löschen und bestimmte Dateierweiterungen oder -typen mit den Befehlen rm, find und globignore ausschließen.
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.
Unter Linux ist ein Shell-Muster eine Zeichenfolge, die aus den folgenden Sonderzeichen besteht, die als Platzhalter oder Metazeichen bezeichnet werden:
*– entspricht null oder mehr Zeichen?– passt zu jedem einzelnen Zeichen[seq]– entspricht jedem Zeichen inseq[!seq]– entspricht jedem Zeichen, das nicht inseqenthalten ist
Es gibt drei mögliche Methoden, die wir hier untersuchen werden, und dazu gehören:
Löschen von Dateien mit erweiterten Mustervergleichsoperatoren
Die erweiterten Mustervergleichsoperatoren sind unten aufgeführt. In diesem Fall bezieht sich pattern-list auf einen oder mehrere Dateinamen, die durch das Zeichen | getrennt sind:
*(pattern-list)– entspricht null oder mehr Vorkommen der angegebenen Muster? (Anleitungs-Liste)– entspricht null oder einem Vorkommen der angegebenen Muster- +(pattern-list) – entspricht einem oder mehreren Vorkommen der angegebenen Muster
@(pattern-list)– entspricht einem der angegebenen Muster! (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 einer bestimmten Datei 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. So entfernen Sie alle Dateien mit Ausnahme von .zip Dateien interaktiv:
rm -i !(*.zip)
4. So löschen Sie alle Dateien mit Ausnahme von .zip und .odt Dateien, während die ausgeführten Aktionen angezeigt werden:
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.
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.
Schlussfolgerung
Dies sind einige einfache und effektive Möglichkeiten, Dateien unter Linux zu löschen, wobei nur diejenigen mit bestimmten Erweiterungen oder Dateinamen intakt bleiben. Wenn Sie andere nützliche Befehlszeilentechniken zum Bereinigen von Verzeichnissen kennen, können Sie diese gerne im Feedback-Abschnitt unten teilen.







