Ich bin auf Globbing-Muster und Wildcards gestoßen und von besonderem Interesse für mich [!]
.
Dieses Konstrukt ähnelt dem
[!]
Konstrukt, stimmt jedoch nicht mit Zeichen in den Klammern überein, sondern mit jedem Zeichen, sofern es nicht zwischen[
und aufgeführt ist]
.
rm myfile [!192]
Ich glaube, dass die oben genannten Dateien alle / alle Dateien entfernen werden, mit Ausnahme aller / aller Dateien, deren Name 192 enthält.
Ich bin jedoch besorgt über die ordnungsgemäße Verwendung mit einer Dateierweiterung und insbesondere über mehrere Bedingungen.
Was wäre die richtige Syntax in einer solchen Situation?
rm myfile [!.gif .csv. mp3]
oder
rm myfile [!.gif !.csv !.mp3]
Ich mache mir Sorgen, dass der Punkt möglicherweise falsch platziert wird und daher jede Datei mit einem .
(was wäre sicherlich eine davon?) Dann manipuliert wird, wenn ich versuchen möchte, bestimmte Dateien zu manipulieren.
Dieses Konstrukt ähnelt dem [ ]
Konstrukt, stimmt jedoch nicht mit Zeichen in den Klammern überein, sondern mit jedem Zeichen, sofern es nicht zwischen [
und aufgeführt ist ]
.
(zitiert aus http://www.tldp.org/LDP/GNU-Linux-Tools-Summary/html/x11655.htm )
Jetzt; für mich bedeutet das, dass dann ein Singular !
ausreicht und alle Werte darin innerhalb des Bereichs enthalten sind.
quelle
ls my-pattern
oderecho my-command
, um zu überprüfen, ob das Globbing wie gewünscht ausgeführt wird, bevor Sie esrm
[!]
es ähnlich, aber nicht ähnlich ist[!]
^
die exakt gleiche Bedeutung wie hat!
in diesem Zusammenhang daher[^a]
schließta
genau wie[!a]
tut: Wenn das erste Zeichen nach dem [a ist! oder a ^ dann wird jedes nicht eingeschlossene Zeichen abgeglichen. (man bash
)rm myfile [!192]
entfernen wirdmyfile
nicht genannt, sowie jede Einzelzeichendatei1
,9
oder2
.Antworten:
Zitieren
man 7 glob
:Schwerpunkt auf die einzelnen Zeichen Teil hier,
[]
kann nicht für ganze Strings in Bash Pattern Matching verwendet werden.bash
Die Klammererweiterung kann verwendet werden, um Zeichenfolgen abzugleichen, es gibt jedoch keine Möglichkeit (ich weiß), sie zu negieren. Z.Bwird erweitert auf
egal ob diese Dateien existieren.
Wie wchargin hervorhob ,
shopt
können erweiterte Mustervergleichsoperatoren verwendet werden, von denen einer ist!()
. Nach dem Laufenshopt -s extglob
zBwird erweitert auf
wenn diese Dateien im aktuellen Verzeichnis vorhanden sind. Weitere Informationen finden Sie unter (
man bash
ERWEITERUNG / Erweiterung des Pfadnamens) und Erweiterung des Pfadnamens (Globbing) .Für das, was Sie versuchen, würde ich immer verwenden
find
, was die Negation und vieles mehr bietet, z. B. auf folgende Weise:Hier werden nur die Ergebnisse aufgelistet. Wenn Sie sie entfernen möchten, fügen Sie die
-delete
Option einfach an das Ende des Befehls an. Wie immer beim Entfernen von Aktionen: Immer zuerst sorgfältig prüfen .find
bietet eine Menge nützlicher Optionen, die sehr gut erklärt werden vonman find
.quelle
find
Befehl rekursiv ist ( bearbeiten: wie ursprünglich gezeigt - ich behalte diesen Kommentar möglicherweise für die zusätzlichen relevanten, aber nicht wesentlichen Informationen, die er übermittelt). Um Dateien zu finden, die sich nur im aktuellen Verzeichnis befinden, aber nicht auch in dessen Unterverzeichnissen - und diese Dateien daher nur zu löschen, wenn die-delete
Aktion hinzugefügt wird -, können Sie sie-maxdepth 1
unmittelbar danach hinzufügenfind .
. Dies würde es mit dem Effekt des Globbings in Einklang bringen, da Globs in Bash nicht rekursiv sind, es sei denn, dieglobstar
Shell-Option ist aktiviert und**
wird verwendet. Der in der Frage gezeigte Glob ist in allen Shells nicht rekursiv.shopt -s extglob
können Sie verwendenecho 1.!(gif|csv|mp3)
, die alles druckt,1.ext
woext
nichtgif
istcsv
, odermp3
. (Siehe den Unterabschnitt "Pattern Matching" vonman bash
.)Ich denke, Sie haben die Verwendung von Klammern falsch verstanden.
[abc]
stimmt mit einem der Zeichen übereina
,b
oderc
.[!abc]
entspricht einem Zeichen, das nicht ista
,b
oderc
. Also der Befehlwird entfernen
myfile
und die Dateien1
,9
und2
weil Sie ein Leerzeichen zwischen myfile und der Klammer haben. Im Gegensatz dazu der Befehlwerden die Dateien entfernen
myfile1
,myfile9
undmyfile2
.quelle
find
.Klammern
[
]
bezeichnen eine Zeichenklasse. Jedes einzelne Zeichen in ihnen kann mit der angegebenen Position übereinstimmen. Soentspricht drei möglichen Namen:
Es stimmt nicht überein
file192
, da es sich nur um das einzelne Zeichen danach handeltfile
.Wir können auch Bereiche in Klammern verwenden.
[0-9]
stimmt mit einer einzelnen Ziffer an der angegebenen Position überein. Für zwei Ziffern brauchen wir[0-9][0-9]
. Für eine Ziffer gefolgt von einem Großbuchstaben könnten wir[0-9][A-Z]
...!
zeigt Negation an.stimmt mit Dateien überein, die nach
file
Ausnahme von1
oder9
oder ein einzelnes Zeichen haben2
. Zum Beispiel wird es mitfile7
undfiles
undfile%
(und vielen anderen) übereinstimmen, aber nichtfile192
, weil das zwei zusätzliche Zeichen hat.Für Ihren Anwendungsfall empfehle ich die Verwendung von
find
anstelle von[!]
. Es hat einennot
Operator.Es ist auch rekursiv , was bedeutet, dass es standardmäßig in alle Unterverzeichnisse verschoben wird. Sie können es auf das aktuelle Verzeichnis mit beschränken
-maxdepth 1
, wenn Sie dies möchten. Shell-Platzhalter (Globbing) sind nicht rekursiv (obwohl rekursives Globbing mit**
aktiviert werden kann).Angenommen, Sie möchten das Löschen von Symlinks nicht vermeiden, können wir
-type d
die negierten Tests ergänzen , um das Löschen von Verzeichnissen zu vermeiden. Vielen Dank an Eliah Kagan für diesen Vorschlag.Wenn Sie sehen, was Sie wollen, können Sie den Befehl mit erneut ausführen
-delete
quelle
[0-9a-fA-F]