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 lokaleman 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, funktioniertrm -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, verwendetgrep
*.txt
als Muster. Wenn ' mehr als eine enthält, wird in allen anderen.txt
-Dateien nach dem ersten Dateinamen gesucht, wobei die Ausgabe vonls
. (Genaue Ergebnisse können von den Glob-Optionen der Shell ' abhängen.) -
.txt$
stimmt mit Zeichenfolgen überein, die mittxt
unabhängig vom Punkt. Weilgrep
den regulären Ausdruck als Parameter verwendet. Die Dateiena.txt
undaatxt
unda-txt
stimmen also alle mit diesem Ausdruck überein. Der korrekte Ausdruck solltels | 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 Testausdruckls | grep \\.txt$ | xargs --no-run-if-empty echo
(Hinweis: Es gibt ' s no-v
-Flag undrm=>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 nurecho
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")