Ich muss alle Dateien in einem Verzeichnis löschen, aber einige davon ausschließen. Zum Beispiel muss a b c ... zich in einem Verzeichnis mit den Dateien alle außer uund löschen p. Gibt es eine einfache Möglichkeit, dies zu tun?
Ich muss alle Dateien in einem Verzeichnis löschen, aber einige davon ausschließen. Zum Beispiel muss a b c ... zich in einem Verzeichnis mit den Dateien alle außer uund löschen p. Gibt es eine einfache Möglichkeit, dies zu tun?
Antworten:
Was ich in diesen Fällen tue, ist zu tippen
rm *
Dann drücke ich Ctrl+ X, erweitern in allen sichtbaren Dateinamen.* *
Dann kann ich einfach die beiden Dateien, die ich behalten möchte, aus der Liste entfernen und schließlich die Befehlszeile ausführen.
*erweitert wird, nicht zu lang wird. : -}
Ctrl+ Shift+ x+*
Für rmalle außer u,pin bash geben Sie einfach ein:
rm !(u|p)
Dazu muss die folgende Option festgelegt werden:
shopt -s extglob
Weitere Infos : glob - Gregs Wiki
shopt -s extglob@Ashot. Außerdem sind es nur Dateien, keine Verzeichnisse, weshalb ich die -rfOptionen in Ihrem Befehl entfernt habe.
rm !(index).html. Dadurch werden alle Dateien mit der Endung ".html" mit Ausnahme von "index.html" gelöscht.
Sie können verwenden find
find . ! -name u ! -name p -maxdepth 1 -type f -delete
! negiert den nächsten Ausdruck-name Gibt einen Dateinamen an-maxdepth 1Der Suchvorgang wird nur für das angegebene Verzeichnis ausgeführt ( findstandardmäßig werden Verzeichnisse durchsucht).-type f verarbeitet nur Dateien (und nicht zum Beispiel Verzeichnisse)-delete löscht die DateienSie können dann die Bedingungen in der Manpage von find anpassen
Aktualisieren
Testen Sie Ihren Befehl zuerst unter Verwendung -printanstelle von-delete
find . ! -name u ! -name p -maxdepth 1 -type f -print-deletekurz danach legt ., wird es eine Katastrophe sein (löscht alle Dateien in CWD)
find . -maxdepth 1 -type f -name '[^up]' -delete
findist mein bester Freund, vor allem, wenn es zu viele Dateien zu glob
Einfach:
mvdie gewünschten dateien in einem oberen verzeichnis, rmdas verzeichnis und dann mvwieder zurück.
rmwithout entfernt -rkeine Unterverzeichnisse.
Etwas ähnlich zu dieser Antwort, aber keine besonderen Optionen erforderlich, soweit ich weiß, wird die folgende "alte" Funktionalität von einer (vagen) / bin / sh-ähnlichen Shell (z. B. bash, zsh, ksh usw.) unterstützt.
rm [^up]
rm [^up]*? Ich mache ziemlich oft ähnliche Dinge.
Tun ohne zu finden:
ls | grep -v '(u|p)' | xargs rm
(Bearbeiten: "u" und "v" werden, wie an anderen Stellen hier, als generische Versionen ganzer regulärer Ausdrücke verwendet. Natürlich sollten Sie darauf achten, Ihre regulären Ausdrücke zu verankern, um zu viele Übereinstimmungen zu vermeiden.)
Sie werden definitiv ein Drehbuch wollen, wenn Sie viel davon tun wollen, wie andere vorgeschlagen haben.
-Eoderegrep
uoder a enthalten.p
grep -L (u|p)' * | xargs rmbei dem es sich um -Leine Liste von Dateinamen handelt, die keine Übereinstimmung enthalten.
uoder enthält p, keine Datei, die a uoder a enthält p. Das ist richtig. Sie können das egrep -v '^(u|p)$'
ls | grep -v 'vuze\|progs' | xargs rm -rf
GLOBIGNORE führt eine durch Doppelpunkte getrennte Liste
GLOBIGNORE=u:p
rm *
rm oder in einem Testverzeichnis!
In der Floppy-Ära hatte ich eine ausführbare Datei namens "Except", die Dinge temporär aus dem aktuellen Verzeichnis verschob und einen Befehl ausführte, also könnte man sagen:
außer * .txt del *. *
um alles außer Ihren Textdateien zu löschen.
Dies wäre eine ziemlich triviale Sache, um sie als Shell-Skript zu implementieren, und wenn dies die Art von Sache ist, die Sie wahrscheinlich mehr als zweimal ausführen, scheint es, als wäre es eine gute Idee.
find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;
Dadurch werden alle Dateien mit Ausnahme von u und p in Unix gelöscht
Für diejenigen, die es vorziehen, beliebige komplexe Ausschlussmuster (die sich über alle betroffenen Dateinamen erstrecken) in einem ausgewachsenen Regexp-Emacs-, Posix-awk- oder Posix-Extended-Stil anzugeben (siehe Manpage finden), würde ich dieses empfehlen. Ausgeschlossen ist uund pin aktuellem Verzeichnis in diesem Beispiel. Dies kann für Skripte nützlich sein.
find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
-regextypefunktioniert nur auf GNU-Versionen
findist eine GNU-Erweiterung des findBefehls. Gleiches gilt für die -regextypeOption. Außerdem löscht Ihr Befehl auch Dateien in Unterverzeichnissen, während die ursprüngliche Frage eindeutig nach Dateien in einem Verzeichnis gestellt wird.
Noch ein anderer:
for FILE in ./*; do if [[ $FILE != ./u* ]] || [[ $FILE != ./p* ]];then rm $FILE; fi; done;
Es ist etwas langwierig und ich weiß nicht, ob Sie es leicht in eine Funktion umwandeln können, die leicht eine beliebige Anzahl von Argumenten aufnehmen kann, aber es funktioniert gut.
Und es ist pure Bash-Güte.
Hier ist eine andere Variante. Du kannst Tippen:
rm -i *
oder:
rm --interactive *
So rmwerden Sie aufgefordert, das Löschen jeder Datei zu bestätigen.
Verwenden:
find . -type f ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
find . -type d ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
um alle Dateien einschließlich der Verzeichnisse mit Ausnahme von u-, p- und .ext-Dateien zu löschen.
Eine einfache Methode, die nur schwer durcheinander zu bringen ist: Nehmen wir an, Sie möchten alles außer * .pdf löschen:
mkdir tmp
mv *.pdf tmp
rm *
mv tmp/* .
rm -r tmp