Ich kann alle txt
Akte unter gegenwärtigem Verzeichnis vorbei löschen rm *.txt
. Weiß jemand, wie man alle Akten im gegenwärtigen Verzeichnis AUSSER txt
Akte löscht ?
Ich kann alle txt
Akte unter gegenwärtigem Verzeichnis vorbei löschen rm *.txt
. Weiß jemand, wie man alle Akten im gegenwärtigen Verzeichnis AUSSER txt
Akte löscht ?
Antworten:
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
*.!(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 {} \;
Sie können invertiertes grep und xargs verwenden
ls | grep -v .txt$| xargs rm
ls | grep -v *.txt | xargs rm
funktioniert genauso gut
grep -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 wird ls
. (Genaue Ergebnisse können von den Glob-Optionen der Shell abhängen.)
.txt$
Stimmt mit Zeichenfolgen überein, die txt
unabhängig vom Punkt enden . Da grep
wird der reguläre Ausdruck als Parameter verwendet. Dateien a.txt
und aatxt
und a-txt
werden 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 -v
Flag 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.
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
-I
Option könnte nützlich sein, aber warum nicht ls analysieren . Und was bringt das | xargs
? Ohne Argumente wird nur die echo
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 :
rm -rf $(ls -aI ".mydir")
ls
bevor Sie tatsächlich versuchen anzurufenrm
.