GNU/Linux >> LINUX-Kenntnisse >  >> Linux

3 Möglichkeiten zum Löschen aller Dateien in einem Verzeichnis außer einer oder wenigen Dateien mit Erweiterungen

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 :

  1. * – stimmt mit null oder mehr Zeichen überein
  2. ? – entspricht jedem einzelnen Zeichen
  3. [seq] – stimmt mit jedem Zeichen in Folge überein
  4. [!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:

  1. *(pattern-list) – stimmt mit null oder mehr Vorkommen der angegebenen Muster überein
  2. ?(pattern-list) – stimmt mit null oder einem Vorkommen der angegebenen Muster überein
  3. +(Musterliste) – stimmt mit einem oder mehreren Vorkommen der angegebenen Muster überein
  4. @(pattern-list) – stimmt mit einem der angegebenen Muster überein
  5. !(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.


Linux
  1. So entfernen Sie alle Dateien in einem Ordner außer einer bestimmten Datei in Linux

  2. Alle Dateien/Verzeichnisse außer einer Datei entfernen?

  3. Alle Dateien außer in einem bestimmten Unterverzeichnis löschen mit Suchen?

  4. Wie lösche ich alle Dateien mit einer bestimmten Erweiterung in einem bestimmten Ordner?

  5. Alte Protokolldateien außer der letzten löschen (alphanumerisch sortiert)?

Verwenden Sie Suchen, um ein bestimmtes Verzeichnis zu finden und alle darin enthaltenen Dateien außer einem Verzeichnis zu löschen?

Entpacken Sie alle Dateien in einem Verzeichnis

Löschen Sie alle Dateien außer den neuesten 3 im Bash-Skript

Können Sie die Berechtigung für alle Dateien außer einem Verzeichnis in Linux ändern?

Löschen Sie alle bis auf 1000 zufällige Dateien in einem Verzeichnis

Wie benenne ich alle Dateien mit Sonderzeichen und Leerzeichen in einem Verzeichnis um?