Manchmal kann es vorkommen, dass Sie alle Dateien in einem Verzeichnis löschen oder einfach ein Verzeichnis bereinigen müssen, indem Sie Dateien mit Ausnahme einiger bestimmter Typen (die mit einer bestimmten Erweiterung enden) löschen. Inhaltsverzeichnis.
In diesem Artikel zeigen wir Ihnen, wie Sie mit den Befehlen rm, find und globignore Dateien in einem Verzeichnis außer der angegebenen Dateierweiterung oder dem angegebenen Dateityp löschen.
Bevor wir fortfahren, beginnen wir mit einem kurzen Blick auf ein wichtiges Konzept in Linux – den Dateinamen-Mustervergleich, der es uns ermöglicht, das vorliegende Problem zu lösen.
Unter Linux ist ein Shell-Muster eine Zeichenfolge, die die folgenden Sonderzeichen, sogenannte Platzhalter oder Metazeichen, enthält:
* – entspricht 0 oder mehr Zeichen
– entspricht einem beliebigen einzelnen Zeichen Zeichen
[sequence] – entspricht jedem Zeichen in der Sequenz
[!sequence] – entspricht jedem Zeichen, das nicht in der Sequenz
uns Hier werden drei mögliche Ansätze untersucht: einschließlich:
Löschen von Dateien mit erweiterten Mustervergleichsoperatoren
Die verschiedenen erweiterten Mustervergleichsoperatoren sind unten aufgeführt. Diese Musterlisten sind eine Liste mit einem oder mehreren Dateinamen:
* (Musterliste) – entspricht 0 oder mehr Vorkommen des angegebenen Musters
? (Musterliste) – entspricht 0 oder mehr Vorkommen des angegebenen Musters 1 Vorkommen des angegebenen Musters
@(Musterliste) – entspricht einem oder mehreren Vorkommen des angegebenen Musters
!(Musterliste) – entspricht allem außer einem angegebenen Muster
Um sie verwenden zu können, benötigen Sie Um die Extglob-Shell-Option wie folgt zu aktivieren:
# shopt -s extglob
1. Geben Sie den folgenden Befehl ein, um alle Dateien in einem Verzeichnis außer Dateiname
$ rm -v !("filename")Alle Dateien außer einer Datei unter Linux löschen2. Alle Dateien außer Dateiname1 und Dateiname2 löschen
$ rm -v !("filename1"|"filename2")Alle Dateien außer einigen Dateien löschen in Linux3. Das folgende Beispiel zeigt, wie alle Dateien außer .zip im interaktiven Modus gelöscht werden
$ rm -i !(*.zip)Alle Dateien außer Zip-Dateien unter Linux löschen 4. Als nächstes können Sie alle Dateien in einem Verzeichnis löschen, mit Ausnahme aller Dateien von .zip- und .odt-Dateien, und beim Löschen die zu löschende Datei anzeigen:
$ rm -v !(*.zip|*.odt)Alle Dateien außer der angegebenen Dateierweiterung löschenSobald Sie alle erforderlichen Befehle ausgeführt haben, können Sie die extglob-Shell-Option auch wie folgt deaktivieren.
$ shopt -u extglobVerwenden Sie unter Linux den Befehl „find“, um Dateien zu löschen. Bei dieser Methode können wir einfach die entsprechenden Optionen des Befehls „find“ verwenden oder Pipes mit dem Befehl „xargs“ verwenden, wie unten gezeigt :
$ 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 im aktuellen Verzeichnis
$ find . -type f -not -name '*.gz' -deleteBefehl „Alle löschen“. Dateien außer .gz 6. Mit Pipes und xargs können Sie das obige Beispiel wie folgt ändern:
$ find . -type f -not -name '*gz' -print0 | xargs -0 -I {} rm -v {}Verwenden Sie die Befehle find und xargs, um Dateien löschen 7. Schauen wir uns ein weiteres Beispiel an. Die folgende Befehlszeile löscht alle Dateien außer .gz, .odt und .jpg im aktuellen Verzeichnis:
$ find . -type f -not \(-name '*gz' -or -name '*odt' -or -name '*.jpg' \) -deleteLöschen Sie alle Dateien außer der angegebenen ErweiterungsdateiLöschen Sie die Datei über die GLOBIGNORE-Variable in BashDie letzte Methode funktioniert jedoch nur mit Bash. Die GLOBIGNORE-Variable speichert eine durch Doppelpunkte getrennte Liste ignorierter Muster (oder Dateinamen) für die Pfadnamenerweiterungsfunktion. Um diese Methode zu verwenden, wechseln Sie in das Verzeichnis, in dem Sie die Datei löschen möchten, und legen Sie die GLOBIGNORE-Variable wie folgt fest:
$ cd test $ GLOBIGNORE=*.odt:*.iso:*.txtIn diesem Fall zusätzlich zu .odt, . iso und . Alle Dateien außer txt werden aus dem aktuellen Verzeichnis gelöscht. Führen Sie nun den folgenden Befehl aus, um dieses Verzeichnis zu leeren:
$ rm -v *Schließen Sie danach die GLOBIGNORE-Variable:
$ unset GLOBIGNORE
使用 bash 变量 GLOBIGNORE 删除文件
注:为了理解上面的命令行采用的标识的意思,请参考我们在每一个插图中使用的命令对应的 man 手册。