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 (die mit einer bestimmten Erweiterung enden) entfernen.
In diesem Artikel zeigen wir Ihnen, wie Sie Dateien in einem Verzeichnis mit Ausnahme bestimmter Dateierweiterungen oder -typen mit rm löschen , finden und globigignore Befehle.
Bevor wir weitermachen, lassen Sie uns damit beginnen, einen kurzen Blick auf ein wichtiges Konzept in Linux zu werfen – den Dateinamen-Musterabgleich, der es uns ermöglichen wird, unser aktuelles Problem zu lösen.
Empfohlener Text: Verwenden Sie den find-Befehl, um mehrere Dateinamen/Erweiterungen in Linux zu suchen
Unter Linux ist ein Shell-Muster eine Zeichenfolge, die aus den folgenden Sonderzeichen besteht, die als Wildcards bezeichnet werden oder Metazeichen :
*
– stimmt mit null oder mehr Zeichen überein?
– entspricht jedem einzelnen Zeichen[seq]
– stimmt mit jedem Zeichen in Folge überein[!seq]
– stimmt mit jedem Zeichen überein, das nicht in Folge steht
Es gibt drei mögliche Methoden, die wir hier untersuchen werden, und dazu gehören:
Dateien mit erweiterten Musterabgleichsoperatoren löschen
Die verschiedenen erweiterten Mustervergleichsoperatoren sind unten aufgeführt, wobei Musterliste ist eine Liste mit einem oder mehreren Dateinamen, getrennt durch |
Zeichen:
*(pattern-list)
– stimmt mit null oder mehr Vorkommen der angegebenen Muster überein?(pattern-list)
– stimmt mit null oder einem Vorkommen der angegebenen Muster überein- +(Musterliste) – stimmt mit einem oder mehreren Vorkommen der angegebenen Muster überein
@(pattern-list)
– stimmt mit einem der angegebenen Muster überein!(pattern-list)
– stimmt mit allem überein, außer mit einem der angegebenen Muster
Um sie zu verwenden, aktivieren Sie extglob Shell-Option 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. Zum Löschen aller Dateien mit Ausnahme von Dateiname1 und Dateiname2 :
$ rm -v !("filename1"|"filename2")
3. Das folgende Beispiel zeigt, wie alle Dateien außer allen .zip
entfernt werden Dateien interaktiv:
$ rm -i !(*.zip)
4. Als nächstes können Sie alle Dateien in einem Verzeichnis außer allen .zip
löschen und .odt
Dateien wie folgt, während angezeigt wird, was getan wird:
$ rm -v !(*.zip|*.odt)
Sobald Sie alle erforderlichen Befehle haben, deaktivieren Sie extglob Shell-Option wie folgt:
$ shopt -u extglob
Dateien mit dem Linux-Suchbefehl löschen
Bei dieser Methode können wir den find-Befehl ausschließlich mit entsprechenden Optionen oder in Verbindung mit xargs verwenden Befehl durch Verwendung einer Pipeline wie in den folgenden Formen:
$ 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. Verwenden 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. Sehen 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
Dateien mit der Bash-Variable GLOBIGNORE löschen
Dieser letzte Ansatz funktioniert jedoch nur mit bash. Hier das GLOBIGNORE Die Variable speichert eine durch Doppelpunkte getrennte Musterliste (Dateinamen), die bei der Erweiterung des Pfadnamens ignoriert werden soll.
Empfohlener Text: Nützliche 12 praktische Beispiele zum Grep-Befehl unter Linux
Um diese Methode anzuwenden, gehen Sie in das Verzeichnis, das Sie bereinigen möchten, und setzen Sie dann GLOBIGNORE Variable wie folgt:
$ cd test $ GLOBIGNORE=*.odt:*.iso:*.txt
In diesem Fall alle Dateien außer .odt
, .iso
, und .txt
Dateien aus dem aktuellen Verzeichnis entfernt werden.
Führen Sie nun den Befehl aus, um das Verzeichnis zu bereinigen:
$ rm -v *
Schalten Sie danach GLOBIGNORE aus Variable:
$ unset GLOBIGNORE
Hinweis :Um die Bedeutung der in den obigen Befehlen verwendeten Flags zu verstehen, lesen Sie die Handbuchseiten der einzelnen Befehle, die wir in den verschiedenen Abbildungen verwendet haben.
Das ist alles! Wenn Sie andere Befehlszeilentechniken für denselben Zweck im Sinn haben, vergessen Sie nicht, uns diese über unseren Feedback-Bereich unten mitzuteilen.