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
-delete
welche Dateien beim Entfernen von -delete
und von gespeichert werden \!
.
find
ist rekursiv! Alle Unterverzeichnisse, die nicht mit ' pattern ' übereinstimmen, werden ebenfalls gelöscht
Verwenden von zsh mit setopt EXTENDED_GLOB
dem ~
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 extglob
Shell-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 rm
mit , echo
um 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
egrep
Argument zu ändern"^(file1|filename2|f1le)$"
a
, b
und a b
das erste Programm wird gelöscht - wenn Sie ab in den grep Teil setzen: "^[ab]$"
a
und b
aber 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 $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.
#! /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 -delete
ist eine Möglichkeit, dies zu umgehen.
tmp
als auch , wenn es keine waren X
/ Y
/ Z
in ihm - Dateien. Beachten Sie !
als Standardäquivalent von GNU -not
( -delete
ist auch eine GNU-Erweiterung)