Ich habe viele Dateien und Ordner in einem bestimmten Ordner und möchte alle löschen. Ich wollte jedoch die Dateien X, Y und Z behalten.
Gibt es eine Möglichkeit, wie ich etwas tun kann: rm * | but NOT grep | X or Y or Z
command-line
rm
Amit
quelle
quelle
Antworten:
Anstatt rm zu verwenden, ist es möglicherweise einfacher, find zu verwenden . Ein Befehl wie dieser löscht alles außer einer Datei mit dem genauen Namen 'file'.
Viele Versionen von sollten in der Lage sein, das Abgleichen von Globen und regulären Ausdrücken zu unterstützen.
Sie können auch die Ausgabe von find an rm leiten
quelle
-delete
welche Dateien beim Entfernen von-delete
und von gespeichert werden\!
.find
ist rekursiv! Alle Unterverzeichnisse, die nicht mit ' pattern ' übereinstimmen, werden ebenfalls gelöschtVerwenden von zsh mit
setopt EXTENDED_GLOB
dem~
Operator ( außer )oder
^
Operator (Verneinung):Aber Sie sollten die Dateien wahrscheinlich stattdessen an einen anderen Ort verschieben und dann alles löschen. Es ist weitaus sicherer in Bezug auf Fingerabdrücke, z. B. wenn Sie zu früh auf die Eingabetaste drücken.
quelle
In späteren Versionen von bash gibt es die
extglob
Shell-Option, mit der Sie eine Syntax festlegen können, um das zu tun, was Sie möchten.Zum Test, empfehle ich Ihnen zunächst ersetzen
rm
mit ,echo
um zu sehen , ob die Liste der Dateien gelöscht werden soll , was Sie erwarten.quelle
Achtung: Führen Sie den Befehl aus. Wenn die zu löschenden Dateien die richtigen sind, führen Sie ihn erneut aus und löschen Sie das Hash-Zeichen "#".
Wenn die Dateinamen komplizierter sind, tun Sie dies
Schauen Sie sich die Ergebnisse noch einmal an und entfernen Sie dann das Hash-Zeichen.
Diese Version - wie in den Kommentaren vorgeschlagen - speichert einige Zeichen und sieht ein bisschen klarer aus.
quelle
egrep
Argument zu ändern"^(file1|filename2|f1le)$"
a
,b
unda b
das erste Programm wird gelöscht - wenn Sie ab in den grep Teil setzen:"^[ab]$"
a
undb
aber nichta b
, im Gegensatz zu nur Ihre Absichten. Der zweite Befehl macht dasselbe. Und der dritte auch. Sie sollten 'ls' in Skripten nicht verwenden, mit sehr, sehr seltenen Ausnahmen. Tu es einfach nicht.Verschieben Sie die Dateien, die Sie fernhalten möchten. Gehe eine Ebene höher und lösche den Ordner. Erstellen Sie den Ordner neu und verschieben Sie diese Dateien zurück.
quelle
/
, heh? Nicht sehr praktisch. c) Es$HOME
ist auch nicht wirklich praktisch , alle Dateien in Ihrem zu entfernen .Dies ist, was ich als .sh-Skript für einen OSX / MacOS-Abmelde-Hook eingerichtet habe, funktioniert gut genug.
quelle
Mit GNU-find können Sie den Schalter -delete verwenden, der auch leere Verzeichnisse entfernt:
quelle
find tmp -maxdepth 1 -not -name X -not -name Y -not -name Z -delete
ist eine Möglichkeit, dies zu umgehen.tmp
als auch , wenn es keine warenX
/Y
/Z
in ihm - Dateien. Beachten Sie!
als Standardäquivalent von GNU-not
(-delete
ist auch eine GNU-Erweiterung)