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?
123
shopt -s dotglob
vor dem Ausführen ausrm (...)
.Antworten:
Was ich in diesen Fällen tue, ist zu tippen
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.
quelle
*
erweitert wird, nicht zu lang wird. : -}Ctrl
+Shift
+x
+*
Für
rm
alle außeru,p
in bash geben Sie einfach ein:Dazu muss die folgende Option festgelegt werden:
Weitere Infos : glob - Gregs Wiki
quelle
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
!
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
quelle
-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 globEinfach:
mv
die gewünschten dateien in einem oberen verzeichnis,rm
das verzeichnis und dannmv
wieder zurück.quelle
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.
quelle
rm [^up]*
? Ich mache ziemlich oft ähnliche Dinge.Tun ohne zu finden:
(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.
quelle
-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ältp
, keine Datei, die au
oder a enthältp
. Das ist richtig. Sie können dasegrep -v '^(u|p)$'
ls | grep -v 'vuze\|progs' | xargs rm -rf
In zsh:
dann
oder
Die zweite funktioniert sogar , wenn Sie
^
in$histchars
für Geschichte Substitution, und natürlich können Sie einen beliebigen glob vor dem setzen~
.quelle
GLOBIGNORE führt eine durch Doppelpunkte getrennte Liste
quelle
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:
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.
quelle
Dadurch werden alle Dateien mit Ausnahme von u und p in Unix gelöscht
quelle
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
undp
in aktuellem Verzeichnis in diesem Beispiel. Dies kann für Skripte nützlich sein.quelle
-regextype
funktioniert nur auf GNU-Versionenfind
ist eine GNU-Erweiterung desfind
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.Ich benutze immer:
Auf diese Weise können Sie definieren, wie detailliert Sie es machen möchten. Wenn Sie also eine bis-zu-Z-Datei löschen möchten, können Sie Folgendes verwenden:
quelle
Noch eine andere Version mit
xargs
:Beachten Sie, dass dies
xargs -I
erforderlich ist, um Dateinamen einschließlich Leerzeichen korrekt zu behandeln.quelle
Noch ein anderer:
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.
quelle
Hier ist eine andere Variante. Du kannst Tippen:
oder:
So
rm
werden Sie aufgefordert, das Löschen jeder Datei zu bestätigen.quelle
Verwenden:
um alle Dateien einschließlich der Verzeichnisse mit Ausnahme von u-, p- und .ext-Dateien zu löschen.
quelle
Eine einfache Methode, die nur schwer durcheinander zu bringen ist: Nehmen wir an, Sie möchten alles außer * .pdf löschen:
quelle