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
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
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'.
find . \! -name 'file' -delete
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
find . \! -name '*pattern*' -print0 | xargs --null rm
-deletewelche Dateien beim Entfernen von -deleteund von gespeichert werden \!.
findist rekursiv! Alle Unterverzeichnisse, die nicht mit ' pattern ' übereinstimmen, werden ebenfalls gelöscht
Verwenden von zsh mit setopt EXTENDED_GLOBdem ~Operator ( außer )
rm -- *~(x|y|z)
oder ^Operator (Verneinung):
rm -- ^(x|y|z)
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.
In späteren Versionen von bash gibt es die extglobShell-Option, mit der Sie eine Syntax festlegen können, um das zu tun, was Sie möchten.
$ shopt -s extglob # turn on extended globbing
$ rm !(X|Y|Z)
Zum Test, empfehle ich Ihnen zunächst ersetzen rmmit , echoum zu sehen , ob die Liste der Dateien gelöscht werden soll , was Sie erwarten.
ls -1 | grep -v "^[XYZ]$" # | xargs rm -r
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
ls -1 | egrep -v "^file1$|^filename2$|^f1le$" # | xargs rm -r
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.
ls -1 | egrep -v "^(file1|filename2|f1le)$" # | xargs rm -r
egrepArgument zu ändern"^(file1|filename2|f1le)$"
a, bund a bdas erste Programm wird gelöscht - wenn Sie ab in den grep Teil setzen: "^[ab]$" aund baber nicht a 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.
/, heh? Nicht sehr praktisch. c) Es $HOMEist 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.
#! /bin/bash
for dir in /PathToFolder/*
do
if [ ! "$dir" = "/PathToFolder/FolderToKeep1" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep2" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep3" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep4" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep5" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep6" ] ; then
echo ${dir}
sudo rm -R $dir user
dscl . -delete $dir
fi
done
exit 0
Mit GNU-find können Sie den Schalter -delete verwenden, der auch leere Verzeichnisse entfernt:
find tmp -not -name X -not -name Y -not -name Z -delete
find tmp -maxdepth 1 -not -name X -not -name Y -not -name Z -deleteist eine Möglichkeit, dies zu umgehen.
tmpals auch , wenn es keine waren X/ Y/ Zin ihm - Dateien. Beachten Sie !als Standardäquivalent von GNU -not( -deleteist auch eine GNU-Erweiterung)