Wie lösche ich unter Linux alle Dateien mit Ausnahme des Musters * .txt?

Ich kann alle txt -Dateien im aktuellen Verzeichnis mit rm *.txt. Weiß jemand, wie man alle Dateien im aktuellen Verzeichnis löscht, AUSSER txt Datei?

Kommentare

  • As Testen Sie die angegebenen Antworten immer mit einem harmlosen Befehl wie ls, bevor Sie tatsächlich versuchen, rm aufzurufen.
  • ^ This Kerl ' mag es nicht, gefährlich zu leben .. 🙂

Antwort

Sie können find verwenden:

find . -type f ! -name "*.txt" -delete 

Oder die erweiterten Globbing-Funktionen von bash:

shopt -s extglob rm *.!(txt) 

Oder in zsh:

setopt extendedglob rm *~*.txt(.) # || ^^^ Only plain files # ||^^^^^ files ending in ".txt" # | \Except # \Everything 

Kommentare

  • Einige davon müssen möglicherweise angepasst werden, je nachdem, ob Sie Ordner haben und was Sie damit tun möchten.
  • Sollte ' t *.!(txt) !(*.txt)?
  • @LauriRanta hängt davon ab, was ' s in dem Ordner, den wir ' hat keine Antwort erhalten. ' ist in Ordnung, wenn alle Dateien Erweiterungen haben, und rm würde ersticken, wenn Ordner vorhanden wären.
  • Ich ' habe ein Problem mit den Klammern. Wenn ich den Globbing-Stil in einem Bash-Skript verwende, beschwert es sich über einen Syntaxfehler und die Klammern. Dies funktioniert jedoch über die CLI.
  • @izogfif Überprüfen Sie, ob diese find . -type f ! -name "*.txt" | xargs -r rm in GNU \ xargs funktioniert. BSD- und UNIX-xargs-Befehl haben möglicherweise nicht -r. Sie müssen Ihre lokale man xargs

Antwort

Wenn Sie nur alle -Dateien außer „* .txt“ löschen möchten, können Sie dies tun Verwenden Sie den folgenden Befehl:

$ find . -type f ! -name "*.txt" -exec rm -rf {} \;

, aber wenn Sie auch löschen möchten Verzeichnisse zusammen mit den Dateien können Sie Folgendes verwenden:

$ find . ! -name "*.txt" -exec rm -r {} \;

Antwort

Es gibt viele Möglichkeiten, dies zu tun. Der einfachste Weg wäre jedoch (bash):

shopt -s extglob rm !(*.txt) 

Kommentare

  • Wie kann ich verwenden? Dies, um mehrere Erweiterungen anzugeben?
  • shopt -s extglob ist leistungsstark. tecmint.com/… bietet gute Beispiele. Um alle außer bestimmten Erweiterungen zu löschen, funktioniert rm -v !(*.zip|*.odt).

Antwort

Sie können invertiertes grep und xargs verwenden.

ls | grep -v .txt$| xargs rm 

Kommentare

  • ls | grep -v *.txt | xargs rm funktioniert genauso gut
  • @phillipsk grep -v *.txt funktioniert nur, wenn ' ist genau eine .txt -Datei. Wenn keine vorhanden ist, verwendet grep *.txt als Muster. Wenn ' mehr als eine enthält, wird in allen anderen .txt -Dateien nach dem ersten Dateinamen gesucht, wobei die Ausgabe von ls. (Genaue Ergebnisse können von den Glob-Optionen der Shell ' abhängen.)
  • .txt$ stimmt mit Zeichenfolgen überein, die mit txt unabhängig vom Punkt. Weil grep den regulären Ausdruck als Parameter verwendet. Die Dateien a.txt und aatxt und a-txt stimmen also alle mit diesem Ausdruck überein. Der korrekte Ausdruck sollte ls | grep -v \\.txt$ | xargs --no-run-if-empty rm sein. Für neugierige Menschen: Wenn Sie sicher mit dem Ausdruck herumspielen möchten, verwenden Sie diesen Testausdruck ls | grep \\.txt$ | xargs --no-run-if-empty echo (Hinweis: Es gibt ' s no -v -Flag und rm=>echo). Hinweis 2: Möglicherweise haben Sie einen doppelten Backslash bemerkt. Eine ist für Regex, eine andere für Bash, um einem Schrägstrich zu entgehen.

Antwort

Eine Lösung ohne find:

mv dir/*.txt otherdir/ rm -r dir mv otherdir dir 

Dies sollte für alle Arten von Shells funktionieren.

Antwort

Führen Sie einfach Folgendes aus:

rm $(ls -I "*.txt" ) # Löscht den Dateityp mit Ausnahme von * .txt

Wenn Sie „außer einem oder mehreren Dateitypen“ löschen müssen, gehen Sie wie folgt vor:

rm $(ls -I "*.txt" -I "*.pdf" ) # Löscht Dateitypen mit Ausnahme von * .txt & * .pdf

Kommentare

  • Willkommen bei StackExchange!Die Option -I könnte nützlich sein, siehe jedoch , warum nicht ls analysieren. Und was erreicht die | xargs? Ohne Argumente wird nur echo für alle Eingaben ausgeführt.
  • Was soll xargs erreichen?
  • Danke, xargs war im obigen Fall nicht nützlich, habe jetzt korrigiert.

Antwort

Dies funktioniert auch, um alle versteckten (Punkt) Dateien und Ordner mit Ausnahme der angegebenen ():

rm -rf $(ls -aI ".mydir") 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.