Es gibt viele Situationen, in denen die Verwendung von a *
praktisch unvermeidlich ist - z. B. rm -rf *
in einem Ordner, der Tausende von Unterordnern und Dateien enthält.
Was aber, wenn Sie nur ein oder zwei Dateien oder Ordner vom rm
Befehl ausschließen möchten ? Ich habe mich durchgegoogelt und nur recht komplizierte Lösungen gefunden, wie hierfind . -depth -not \( -name 'one' -o -name 'two' \
-o -name 'three' \) -exec rm {} \;
angegeben .
Gibt es eine Möglichkeit, dies auf einfachere Weise zu tun - ohne diesen Umweg find
? ZB rm -rf --exclude='one' --exclude='two' --exclude='three' *
wie in rsync oder einfach rm -rf -e 'one','two','three' *
?
Vielleicht sogar eine allgemeine Möglichkeit auszuschließen , die Dinge aus *
(so andere Befehle wie cp
, mv
... müssen nicht ihre eigenen implementieren)? Sowas *{'one','two','three'}
oder so?
quelle
find
mit der--delete
Option (keine Notwendigkeit,rm
für jede Datei auszuführen . Das ist unnötiger Aufwand) verwenden.mv -t /tmp one two three && rm -rf * && mv -t . /tmp/one /tmp/two /tmp/three
, aber ich würde eine Lösung vorziehen, die die Möglichkeit bietet, explizit etwas davon auszuschließen*
. Es wird sicherlich Situationen geben, in denen das Verschieben oder Kopieren der Dateien zu einem anderen Ziel nicht möglich ist.Antworten:
Für Bash gibt es eine Shell-Option
extglob
, die standardmäßig deaktiviert ist , um die Kompatibilität mit der Standard-Shell-Syntax zu gewährleisten. Extglob ergänzt die Syntax von zusätzlichen Operatoren wie!()
,?()
,@()
und einige mehr.Geben Sie zum Einschalten
extglob
Folgendes einshopt -s extglob
. Damit es für den aktuellen Benutzertyp eingeschaltet bleibtecho 'shopt -s extglob' >> ~/.bashrc
.Zum rm Beispiel: Mit können
extglob
Sie verwendenquelle
shopt
ding in dein stecken~/.bashrc
, es kann nicht schaden.*
überhaupt nicht, sondern fügt stattdessen ähnliche Indikatoren (wie die!
) hinzu, die zusätzliche Funktionen haben. In diesem Fall wäre es eine schöne Lösung.Ich habe bis auf genau das gebaut (sry, dass ich noch keine Dokumentation hinzufügen konnte).
Ich habe einen Ordner wie den folgenden:
Tippen
except b d
gibt Ihnena
undc
Jetzt können Sie das weiterleiten
rm
.Dies kann schwer zu merken sein. Warum also nicht einfach ein Skript über except erstellen, das heißt
rm-except
:Ähnlich einfach ist
ls-except
:quelle
Als Alternative zu extglob (obwohl das eine sehr gute Antwort ist und jeder
shopt -s extglob globstar
in seiner .bashrc haben sollte) können Sie die globale Variable $ GLOBIGNORE verwenden . Angenommen, Sie möchten alle Dateien außer 'foo.txt' und 'bar baz.txt' abrufen:... aktiviert jedoch die Shell-Option. Dies
dotglob
bedeutet, dass*
Dateien, die mit einem Punkt beginnen (normalerweise ausgeblendet), abgeglichen werden. Sie benötigen also zwei Befehle:Da es sich um eine globale Variable handelt, wirkt sich dies auf jedes von Ihnen verwendete Glob aus, bis $ GLOBSTAR entweder durch Abmelden oder mit deaktiviert wird
Es funktioniert auch nur mit den Literalzeichenfolgen, die an die Variable übergeben wurden. Sie können sehen, was ich meine, indem Sie $ GLOBIGNORE setzen und den Unterschied zwischen diesen Befehlen betrachten:
quelle