Ich muss alle Dateien in einem Verzeichnis löschen, aber einige davon ausschließen. Zum Beispiel muss a b c ... z
ich in einem Verzeichnis mit den Dateien alle außer u
und 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 ... z
ich in einem Verzeichnis mit den Dateien alle außer u
und 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 rm
alle außer u,p
in 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 -rf
Optionen 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 1
Der Suchvorgang wird nur für das angegebene Verzeichnis ausgeführt ( find
standardmäß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 -print
anstelle von-delete
find . ! -name u ! -name p -maxdepth 1 -type f -print
-delete
kurz danach legt .
, wird es eine Katastrophe sein (löscht alle Dateien in CWD)
find . -maxdepth 1 -type f -name '[^up]' -delete
find
ist mein bester Freund, vor allem, wenn es zu viele Dateien zu glob
Einfach:
mv
die gewünschten dateien in einem oberen verzeichnis, rm
das verzeichnis und dann mv
wieder zurück.
rm
without entfernt -r
keine 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.
-E
oderegrep
u
oder a enthalten.p
grep -L (u|p)' * | xargs rm
bei dem es sich um -L
eine Liste von Dateinamen handelt, die keine Übereinstimmung enthalten.
u
oder enthält p
, keine Datei, die a u
oder 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 u
und p
in 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
-regextype
funktioniert nur auf GNU-Versionen
find
ist eine GNU-Erweiterung des find
Befehls. Gleiches gilt für die -regextype
Option. 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 rm
werden 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