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 ?
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 ?
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)?
rmersticken würden, wenn es Ordner gäbe.
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
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 rmfunktioniert genauso gut
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.)
.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.
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
-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.
xargssoll erreicht werden?
Dies funktioniert auch, um alle versteckten (Punkt-) Dateien und Ordner mit Ausnahme des angegebenen ( .mydir) zu entfernen :
rm -rf $(ls -aI ".mydir")
lsbevor Sie tatsächlich versuchen anzurufenrm.