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,rmaufzurufen. - ^ 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
rmwü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 rmin 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 extglobist 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 rmfunktioniert genauso gut - @phillipsk
grep -v *.txtfunktioniert nur, wenn ' ist genau eine.txt-Datei. Wenn keine vorhanden ist, verwendetgrep*.txtals 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 mittxtunabhängig vom Punkt. Weilgrepden regulären Ausdruck als Parameter verwendet. Die Dateiena.txtundaatxtunda-txtstimmen also alle mit diesem Ausdruck überein. Der korrekte Ausdruck solltels | grep -v \\.txt$ | xargs --no-run-if-empty rmsein. 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
-Ikönnte nützlich sein, siehe jedoch , warum nicht ls analysieren. Und was erreicht die| xargs? Ohne Argumente wird nurechofür alle Eingaben ausgeführt. - Was soll
xargserreichen? - 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")