Bash/Expansion von Dateinamen: Unterschied zwischen den Versionen
K Textersetzung - „Kurzbeschreibung“ durch „Beschreibung“ |
|||
(22 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
'''topic''' - Beschreibung | |||
=== Beschreibung === | |||
Nach der [[Bash/Wortaufteilung|Wortaufteilung]] sucht Bash jedes Wort nach den Zeichen "*", "?" und "[" ab, sofern nicht die Option -f gesetzt wurde. | |||
Wenn eines dieser Zeichen auftaucht, wird das Wort als ''PATTERN'' betrachtet und durch eine alphabetisch sortierte Liste von Dateinamen ersetzt, die dem Muster entsprechen. | |||
Wenn keine passenden Dateinamen gefunden werden und die Shell-Option nullglob deaktiviert ist, wird das Wort unverändert gelassen. | |||
Wenn die Option nullglob gesetzt ist und keine Übereinstimmungen gefunden werden, wird das Wort entfernt. | |||
Wenn die Shell-Option nocaseglob aktiviert ist, wird die Übereinstimmung ohne Rücksicht auf die Groß- und Kleinschreibung der Buchstaben durchgeführt. | |||
Wenn ein Muster für die Generierung von Dateinamen verwendet wird, muss das Zeichen "." am Anfang eines Dateinamens oder unmittelbar nach einem Schrägstrich explizit abgeglichen werden, es sei denn, die Shell-Option dotglob ist gesetzt. | |||
Beim Abgleich eines Dateinamens muss das Schrägstrichzeichen immer explizit abgeglichen werden. In anderen Fällen wird das "."-Zeichen nicht besonders behandelt. | |||
Die Shell-Variable GLOBIGNORE kann verwendet werden, um die Menge der Dateinamen einzuschränken, die einem Muster entsprechen. | |||
Wenn GLOBIGNORE gesetzt ist, wird jeder übereinstimmende Dateiname, der auch mit einem der Muster in GLOBIGNORE übereinstimmt, aus der Liste der Übereinstimmungen entfernt. | |||
Die Dateinamen . und .. werden immer ignoriert, auch wenn GLOBIGNORE gesetzt ist. | |||
Das Setzen von GLOBIGNORE hat jedoch den Effekt, dass die Shell-Option dotglob aktiviert wird, so dass alle anderen Dateinamen, die mit einem "." beginnen, übereinstimmen. | |||
Um das alte Verhalten des Ignorierens von Dateinamen, die mit einem "." beginnen, zu erhalten, machen Sie ".*" zu einem der Muster in GLOBIGNORE. Die Option dotglob ist deaktiviert, wenn GLOBIGNORE nicht gesetzt ist. | |||
=== Metazeichen und Globbing === | === Metazeichen und Globbing === | ||
Zeile 57: | Zeile 57: | ||
'''Es gibt folgende Metazeichen''' | '''Es gibt folgende Metazeichen''' | ||
{| | {| class="wikitable" | ||
|- | |- | ||
| | '''*''' | | | '''*''' | ||
Zeile 83: | Zeile 83: | ||
rm a* löscht beispielsweise alle Dateien, die mit "a" anfangen. | rm a* löscht beispielsweise alle Dateien, die mit "a" anfangen. | ||
rm a * löscht dagegen erst die Datei "a" und dann alle Dateien im Verzeichnis. | rm a * löscht dagegen erst die Datei "a" und dann alle Dateien im Verzeichnis. | ||
=== Zeichenbereiche === | === Zeichenbereiche === | ||
Zeile 95: | Zeile 95: | ||
* | * | ||
Sie können die eckigen Klammern aber auch verwenden, um ein beliebiges eingeschlossenes Zeichen oder eine Reihe von Zeichen zu finden, wenn die Zeichenpaare durch einen Bindestrich getrennt sind. Ein Beispiel: | |||
ls -ld [a-cx-z]* | ls -ld [a-cx-z]* | ||
Zeile 104: | Zeile 104: | ||
drwxrwxr-x 3 dirkwagner dirkwagner 4096 Mar 22 2002 xml/ | drwxrwxr-x 3 dirkwagner dirkwagner 4096 Mar 22 2002 xml/ | ||
Dies listet alle Dateien im Heimatverzeichnis von ''dirkwagner'' auf, die mit "a", "b", "c", "x", "y" oder "z" beginnen. | |||
Wenn das erste Zeichen innerhalb der geschweiften Klammern "!" oder "^" ist, wird jedes Zeichen, das nicht eingeschlossen ist, abgeglichen. | |||
Um den Bindestrich ("-") zu finden, fügen Sie ihn als erstes oder letztes Zeichen in die Menge ein. | |||
Die Sortierung hängt vom aktuellen Gebietsschema und vom Wert der Variablen LC_COLLATE ab, falls diese gesetzt ist. | |||
Beachten Sie, dass andere Sprachumgebungen "[a-cx-z]" als "[aBbCcXxYyZz]" interpretieren könnten, wenn die Sortierung in Wörterbuchreihenfolge erfolgt. | |||
Wenn Sie sicher sein wollen, dass Sie die traditionelle Interpretation von Bereichen haben, erzwingen Sie dieses Verhalten, indem Sie LC_COLLATE oder LC_ALL auf "C" setzen. | |||
=== Nullglob === | === Nullglob === | ||
Zeile 138: | Zeile 138: | ||
. .. .bash_history .bash_profile .bashrc | . .. .bash_history .bash_profile .bashrc | ||
=== Globbing und Brace Expansion === | === ''Globbing'' und ''Brace Expansion'' === | ||
''Brace Expansion ''hat starke Ähnlichkeit mit Globbing doch die angegebenen Dateinamen müssen nicht existieren. | ''Brace Expansion'' hat starke Ähnlichkeit mit Globbing doch die angegebenen Dateinamen müssen nicht existieren. | ||
ls | ls | ||
Zeile 151: | Zeile 151: | ||
=== Zeichenklassen === | === Zeichenklassen === | ||
[[Bash/Zeichenklassen]] | |||
=== Erweitertes Globbing (Extglob) === | |||
[[Bash/Extglob]] | |||
=== | |||
=== | |||
< | <noinclude> | ||
== Anhang == | |||
=== Siehe auch === | |||
{{Special:PrefixIndex/{{BASEPAGENAME}}}} | |||
==== Links ==== | |||
===== Weblinks ===== | |||
[[Kategorie:Bash/Expansionen]] | [[Kategorie:Bash/Expansionen]] | ||
</noinclude> |
Aktuelle Version vom 19. Oktober 2024, 13:41 Uhr
topic - Beschreibung
Beschreibung
Nach der Wortaufteilung sucht Bash jedes Wort nach den Zeichen "*", "?" und "[" ab, sofern nicht die Option -f gesetzt wurde.
Wenn eines dieser Zeichen auftaucht, wird das Wort als PATTERN betrachtet und durch eine alphabetisch sortierte Liste von Dateinamen ersetzt, die dem Muster entsprechen.
Wenn keine passenden Dateinamen gefunden werden und die Shell-Option nullglob deaktiviert ist, wird das Wort unverändert gelassen.
Wenn die Option nullglob gesetzt ist und keine Übereinstimmungen gefunden werden, wird das Wort entfernt.
Wenn die Shell-Option nocaseglob aktiviert ist, wird die Übereinstimmung ohne Rücksicht auf die Groß- und Kleinschreibung der Buchstaben durchgeführt.
Wenn ein Muster für die Generierung von Dateinamen verwendet wird, muss das Zeichen "." am Anfang eines Dateinamens oder unmittelbar nach einem Schrägstrich explizit abgeglichen werden, es sei denn, die Shell-Option dotglob ist gesetzt.
Beim Abgleich eines Dateinamens muss das Schrägstrichzeichen immer explizit abgeglichen werden. In anderen Fällen wird das "."-Zeichen nicht besonders behandelt.
Die Shell-Variable GLOBIGNORE kann verwendet werden, um die Menge der Dateinamen einzuschränken, die einem Muster entsprechen.
Wenn GLOBIGNORE gesetzt ist, wird jeder übereinstimmende Dateiname, der auch mit einem der Muster in GLOBIGNORE übereinstimmt, aus der Liste der Übereinstimmungen entfernt.
Die Dateinamen . und .. werden immer ignoriert, auch wenn GLOBIGNORE gesetzt ist.
Das Setzen von GLOBIGNORE hat jedoch den Effekt, dass die Shell-Option dotglob aktiviert wird, so dass alle anderen Dateinamen, die mit einem "." beginnen, übereinstimmen.
Um das alte Verhalten des Ignorierens von Dateinamen, die mit einem "." beginnen, zu erhalten, machen Sie ".*" zu einem der Muster in GLOBIGNORE. Die Option dotglob ist deaktiviert, wenn GLOBIGNORE nicht gesetzt ist.
Metazeichen und Globbing
Damit man beim Angeben von z. B. Dateinamen nicht alle Namen eintippen muss, sondern die Dateien auch alle oder nach bestimmten Kriterien auswählen kann, gibt es Metazeichen (Jokerzeichen, Wildcards).
Metazeichen sind Zeichen mit erweiterter Bedeutung
Expansion von Dateinamen
Im Gegensatz zu anderen Systemen (z. B. Windows) werden Metazeichen von der Shell durch alle passenden Dateinamen ersetzt, bevor sie die Befehlszeile ausführt. Dies führt zu einem für Windows-Anwender ungewohntem Verhalten.
Metazeichen werden von der Shell ersetzt
Vorteile* liegt darin, dass, dass nahezu jedes UNIX-Kommando als Dateiangabe eine beliebige Menge von Dateien als Parameter haben kann.
- So sind in Programmen keine Systemaufrufe nötig, die auf die Verzeichnisinformation zugreifen; es wird lediglich eine Schleife benötigt, welche die einzelnen Dateien nacheinander bearbeitet.
Praktisches Globbing
Ganz schlecht
chmod a+r witzig1.jpg chmod a+r witzig2.jpg chmod a+r witzig3.jpg
Besser
chmod a+r witzig1.jpg witzig2.jpg witzig3.jpg
Super
chmod a+r *.jpg
Es gibt folgende Metazeichen
* | Der Stern steht für eine beliebige Zeichenfolge - oder für überhaupt kein Zeichen.
"ab*" steht für alle Dateinamen, die mit "ab" anfangen, auch für "ab" selbst ("ab", "abc", "abcd", "abxyz", usw.). |
? | Das Fragezeichen steht für genau ein beliebiges Zeichen. Zum Beispiel
"?bc" steht für alle Dateinamen mit 3 Zeichen, die auf "bc" enden ("abc", "bbc", "1bc", "vbc", "xbc", usw.), nicht jedoch für "bc". |
[...] | Im einfachsten Fall steht es für genau ein Zeichen aus der Menge (bspw. "[aeiou]" für einen Vokal).
Diese Angabe kann negiert werden ("alle außer diese Zeichen"), indem das erste Zeichen nach [ ein ! oder ^ ist ("[!abc]" bzw. "[^abc]"). Anstatt einzelne Zeichen aufzuzählen, lassen sich Bereiche angeben ("[a-z]" meint alle Kleinbuchstaben). |
Wichtig!
Der * ist ein gefährliches Zeichen, Tippfehler könne zum Fiasko führen, wenn aus Versehen ein Leerzeichen zuviel getippt wird.
rm a* löscht beispielsweise alle Dateien, die mit "a" anfangen. rm a * löscht dagegen erst die Datei "a" und dann alle Dateien im Verzeichnis.
Zeichenbereiche
Außer grep und Regulären Ausdrücken, gibt es eine gute Auswahl an pattern matching, dass die Shell direkt durchführen kann, ohne dass dafür externe Programme eingesetzt werden müssen.
Bekannt sind sicherlich das Sternchen (asterisk) „*“ und das Fragezeichen (question mark) „?“, die jede Zeichenkette oder jeden Buchstaben filtern. Um diese Sonderzeichen als Literale zu filtern müssen sie maskiert werden:
touch "*" ls "*" *
Sie können die eckigen Klammern aber auch verwenden, um ein beliebiges eingeschlossenes Zeichen oder eine Reihe von Zeichen zu finden, wenn die Zeichenpaare durch einen Bindestrich getrennt sind. Ein Beispiel:
ls -ld [a-cx-z]* drwxr-xr-x 2 dirkwagner dirkwagner 4096 Jul 20 2002 app-defaults/ drwxrwxr-x 4 dirkwagner dirkwagner 4096 May 25 2002 arabic/ drwxrwxr-x 2 dirkwagner dirkwagner 4096 Mar 4 18:30 bin/ drwxr-xr-x 7 dirkwagner dirkwagner 4096 Sep 2 2001 crossover/ drwxrwxr-x 3 dirkwagner dirkwagner 4096 Mar 22 2002 xml/
Dies listet alle Dateien im Heimatverzeichnis von dirkwagner auf, die mit "a", "b", "c", "x", "y" oder "z" beginnen.
Wenn das erste Zeichen innerhalb der geschweiften Klammern "!" oder "^" ist, wird jedes Zeichen, das nicht eingeschlossen ist, abgeglichen.
Um den Bindestrich ("-") zu finden, fügen Sie ihn als erstes oder letztes Zeichen in die Menge ein.
Die Sortierung hängt vom aktuellen Gebietsschema und vom Wert der Variablen LC_COLLATE ab, falls diese gesetzt ist.
Beachten Sie, dass andere Sprachumgebungen "[a-cx-z]" als "[aBbCcXxYyZz]" interpretieren könnten, wenn die Sortierung in Wörterbuchreihenfolge erfolgt.
Wenn Sie sicher sein wollen, dass Sie die traditionelle Interpretation von Bereichen haben, erzwingen Sie dieses Verhalten, indem Sie LC_COLLATE oder LC_ALL auf "C" setzen.
Nullglob
Ohne Match wird das Argument unverändert übernommen. Dieses Verhalten lässt sich mit der Shelloption nullglob beeinflussen.
Match - gefundene Dateien werden übernommen
echo a1*.jpg a1.jpg a10.jpg a11.jpg
Kein Match - Argument bleibt unverändert
echo b1*.jpg b1*.jpg
Dotfiles
Der Punkt am Anfang von Dateinamen stellt eine Ausnahme dar, er muss explizit angegeben werden (wegen der Verzeichnisreferenzen "." bzw. ".." und der Tatsache, dass Dateien, die mit einem Punkt beginnen, normalerweise nicht angezeigt werden). * Dateien, die mit "." beginnen sind versteckt
- Shell Globbing ignoriert die "Dotfiles"
- Punkt muss explizit genannt werden
echo .* . .. .bash_history .bash_profile .bashrc
Globbing und Brace Expansion
Brace Expansion hat starke Ähnlichkeit mit Globbing doch die angegebenen Dateinamen müssen nicht existieren.
ls a1.jpg a10.jpg a11.jpg a2.jpg a3.jpg a4.jpg
"{name1,name2}" - Alternativen aufzählen
echo a{2,10}.jpg a2.jpg a10.jpg
Zeichenklassen
Erweitertes Globbing (Extglob)