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


73

Ich kann alle txtAkte unter gegenwärtigem Verzeichnis vorbei löschen rm *.txt. Weiß jemand, wie man alle Akten im gegenwärtigen Verzeichnis AUSSER txtAkte löscht ?


20
Testen Sie die gegebenen Antworten wie immer mit einem harmlosen Befehl, lsbevor Sie tatsächlich versuchen anzurufen rm.
Chepner

Antworten:


111

Sie können verwenden find:

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

Einige davon müssen möglicherweise angepasst werden, je nachdem, ob Sie über Ordner verfügen und was Sie damit tun möchten.
Kevin

1
Sollte nicht *.!(txt)sein !(*.txt)?
Lri

@LauriRanta hängt davon ab, was sich in dem Ordner befindet, auf den wir keine Antwort erhalten haben. Es ist in Ordnung, wenn alle Dateien Erweiterungen haben und rmersticken würden, wenn es Ordner gäbe.
Kevin

Ich habe ein Problem mit den Klammern. Wenn ich den Globbing-Stil in einem Bash-Skript verwende, wird über einen Syntaxfehler und die Klammern geklagt. Dies funktioniert jedoch über die CLI.
CMCDragonkai

1
@izogfif überprüfe, ob dies find . -type f ! -name "*.txt" | xargs -r rmin GNU \ xargs funktionieren würde. BSD und UNIX xargs Befehl möglicherweise nicht haben -r Sie müssen prüfen , lokaleman xargs
Ntwobike

10

Wenn Sie nur alle Dateien mit Ausnahme von '* .txt' löschen möchten, können Sie den folgenden Befehl verwenden:

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

Wenn Sie jedoch auch Verzeichnisse zusammen mit den Dateien löschen möchten, können Sie dies verwenden:

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


9

es gibt viele möglichkeiten dies zu tun. aber der einfachste Weg wäre (bash):

shopt -s extglob
rm !(*.txt)

4

Eine Lösung ohne find:

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

Dies sollte auf allen Arten von Muscheln funktionieren.


3

Sie können invertiertes grep und xargs verwenden

ls | grep -v .txt$| xargs rm

ls | grep -v *.txt | xargs rmfunktioniert genauso gut
phillipsk

@phillipsk grep -v *.txtfunktioniert nur, wenn genau eine .txtDatei vorhanden ist. Wenn es keine gibt, grepwird *.txtals Muster verwendet; Wenn mehrere .txtDateien vorhanden sind, wird in allen anderen Dateien nach dem ersten Dateinamen gesucht , wobei die Ausgabe von ignoriert wird ls. (Genaue Ergebnisse können von den Glob-Optionen der Shell abhängen.)
JigglyNaga

.txt$Stimmt mit Zeichenfolgen überein, die txtunabhängig vom Punkt enden . Da grepwird der reguläre Ausdruck als Parameter verwendet. Dateien a.txtund aatxtund a-txtwerden also alle mit diesem Ausdruck abgeglichen. Richtiger Ausdruck sollte sein ls | grep -v \\.txt$ | xargs --no-run-if-empty rm. Für Neugierige: 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 kein -vFlag und rm=>echo). Hinweis 2: Möglicherweise haben Sie einen doppelten Backslash bemerkt. Einer ist für Regex, ein anderer ist für Bash, um einem Schrägstrich zu entgehen.
Dimitry K

1

Mach einfach:

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 und * .pdf


Willkommen bei StackExchange! Die -IOption könnte nützlich sein, aber warum nicht ls analysieren . Und was bringt das | xargs? Ohne Argumente wird nur die echogesamte Eingabe ausgeführt.
JigglyNaga

Was xargssoll erreicht werden?
Dhag

Danke, xargs war im obigen Fall nicht sinnvoll, habe jetzt korrigiert.
Surya

0

Dies funktioniert auch, um alle versteckten (Punkt-) Dateien und Ordner mit Ausnahme des angegebenen ( .mydir) zu entfernen :

rm -rf $(ls -aI ".mydir")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.