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 ?
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:
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 :
ls
bevor Sie tatsächlich versuchen anzurufenrm
.Antworten:
Sie können verwenden
find
:Oder die erweiterten Globbing-Funktionen von bash:
Oder in zsh:
quelle
*.!(txt)
sein!(*.txt)
?rm
ersticken würden, wenn es Ordner gäbe.find . -type f ! -name "*.txt" | xargs -r rm
in GNU \ xargs funktionieren würde. BSD und UNIX xargs Befehl möglicherweise nicht haben -r Sie müssen prüfen , lokaleman xargs
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 {} \;
quelle
es gibt viele möglichkeiten dies zu tun. aber der einfachste Weg wäre (bash):
quelle
Eine Lösung ohne
find
:Dies sollte auf allen Arten von Muscheln funktionieren.
quelle
Sie können invertiertes grep und xargs verwenden
quelle
ls | grep -v *.txt | xargs rm
funktioniert genauso gutgrep -v *.txt
funktioniert nur, wenn genau eine.txt
Datei vorhanden ist. Wenn es keine gibt,grep
wird*.txt
als Muster verwendet; Wenn mehrere.txt
Dateien vorhanden sind, wird in allen anderen Dateien nach dem ersten Dateinamen gesucht , wobei die Ausgabe von ignoriert wirdls
. (Genaue Ergebnisse können von den Glob-Optionen der Shell abhängen.).txt$
Stimmt mit Zeichenfolgen überein, dietxt
unabhängig vom Punkt enden . Dagrep
wird der reguläre Ausdruck als Parameter verwendet. Dateiena.txt
undaatxt
unda-txt
werden also alle mit diesem Ausdruck abgeglichen. Richtiger Ausdruck sollte seinls | grep -v \\.txt$ | xargs --no-run-if-empty rm
. Für Neugierige: Wenn Sie sicher mit dem Ausdruck herumspielen möchten, verwenden Sie diesen Testausdruckls | grep \\.txt$ | xargs --no-run-if-empty echo
(Hinweis: Es gibt kein-v
Flag undrm=>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.Mach einfach:
rm $(ls -I "*.txt" )
# Löscht den Dateityp mit Ausnahme von * .txtWenn 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 * .pdfquelle
-I
Option könnte nützlich sein, aber warum nicht ls analysieren . Und was bringt das| xargs
? Ohne Argumente wird nur dieecho
gesamte Eingabe ausgeführt.xargs
soll erreicht werden?Dies funktioniert auch, um alle versteckten (Punkt-) Dateien und Ordner mit Ausnahme des angegebenen (
.mydir
) zu entfernen :quelle