
glob – the owner is dmr, short for Dennis MacAlistair Ritchie.glob() (/ɡlɒb/) is a POSIX C function for globbing, which is the archetypal use of pattern matching against the names in a filesystem directory such that a name pattern is expanded into a list of names matching that pattern. Although globbing may now refer to glob()-style pattern matching of any string, not just expansion into a list of filesystem names, the original meaning of the term is still widespread.
The glob() function and the underlying gmatch() function originated at Bell Labs in the early 1970s alongside the original AT&T UNIX itself and had a formative influence on the syntax of UNIX command line utilities and therefore also on the present-day reimplementations thereof.
In their original form, glob() and gmatch() derived from code used in Bell Labs in-house utilities that developed alongside the original Unix in the early 1970s. Among those utilities were also two command line tools called glob and find; each could be used to pass a list of matching filenames to other command line tools, and they shared the backend code subsequently formalized as glob() and gmatch(). Shell-statement-level globbing by default became commonplace following the "builtin"-integration of globbing-functionality into the 7th edition of the Unix shell in 1978. The Unix shell's -f option to disable globbing — i.e. revert to literal "file" mode — appeared in the same version.
The glob pattern quantifiers now standardized by POSIX.2 (IEEE Std 1003.2) fall into two groups, and can be applied to any character sequence ("string"), not just to directory entries.
- "Metacharacters" (also called "Wildcards"):
?(not in brackets) matches any character exactly once.*(not in brackets) matches a string of zero or more characters.
- "Ranges/sets":
[...], where the first character within the brackets is not '!', matches any single character among the characters specified in the brackets. If the first character within brackets is '!', then the[!...]matches any single character that is not among the characters specified in the brackets.
- Die Zeichen in den Klammern können eine Liste (
[abc]) oder ein Bereich ([a-c]) sein oder eine Zeichenklasse bezeichnen (wie z. B.[[:space:]]wenn die inneren Klammern Teil des Klassennamens sind). POSIX schreibt keine Unterstützung für mehrere Bereiche ( ) vor , die ursprünglich von regulären Ausdrücken[a-c0-3]abgeleitet sind .
- Die Zeichen in den Klammern können eine Liste (
Mit der zunehmenden Verbreitung von Neuimplementierungen des UNIX-Systems der Bell Labs verbreiteten sich auch Neuimplementierungen der zugehörigen libc und Shell sowie die Verwendung glob()von Globbing . Heute sind Globbing glob()und die Verwendung von Globbing durch die POSIX.2- Spezifikation standardisiert und integraler Bestandteil jedes Unix-ähnlichen libc-Ökosystems und jeder Shell, einschließlich der AT&T Bourne Shell-kompatiblen Korn Shell (ksh) , der Z Shell (zsh) , der Almquist Shell (ash) und ihrer Derivate und Neuimplementierungen wie Busybox , Toybox , GNU Bash und Debian Dash .
Herkunft
Der Befehl `glob`, kurz für global , stammt aus den frühen Versionen von Bell Labs' Unix . [ 1 ] Die Befehlsinterpreter der frühen Unix-Versionen (1. bis 6. Edition, 1969–1975) verwendeten ein separates Programm, um Platzhalterzeichen in nicht in Anführungszeichen gesetzten Argumenten eines Befehls zu erweitern /etc/glob. Dieses Programm führte die Erweiterung durch und übergab die erweiterte Liste der Dateipfade zur Ausführung an den Befehl.
Glob wurde ursprünglich in der Programmiersprache B geschrieben . Es war die erste Unix-Hauptsoftware, die in einer höheren Programmiersprache entwickelt wurde . [ 2 ] Später wurde diese Funktionalität als C- Bibliotheksfunktion bereitgestellt , glob()die von Programmen wie der Shell verwendet wird . Sie basiert üblicherweise auf einer Funktion namens `match` fnmatch(), die prüft, ob eine Zeichenkette einem gegebenen Muster entspricht. Das Programm, das diese Funktion verwendet, kann dann eine Reihe von Zeichenketten (üblicherweise Dateinamen) durchlaufen, um die passenden zu finden. Beide Funktionen sind Teil von POSIX : die in POSIX.1 seit 2001 definierten Funktionen und die in POSIX.2 definierte Syntax. [ 3 ] [ 4 ] Die Idee, eine separate Match-Funktion zu definieren, entstand mit Wildmat (Wildcard-Match), einer einfachen Bibliothek zum Abgleich von Zeichenketten mit Bourne-Shell-Globs.
Traditionell werden versteckte Dateien in Form von Unix -Punktdateien nicht durch Glob-Muster erfasst ; um sie zu finden, muss das Muster explizit mit einem Punkt beginnen .. Beispielsweise *findet `glob` alle sichtbaren Dateien, während ` .*glob` alle versteckten Dateien findet.
Syntax
Die häufigsten Platzhalter sind *, ?, und […].
| Wildcard | Beschreibung | Beispiel | Spiele | Stimmt nicht überein |
|---|---|---|---|---|
* | entspricht einer beliebigen Anzahl beliebiger Zeichen, einschließlich keiner. | Law* | Law, Laws, oderLawyer | GrokLaw, La, oderaw |
*Law* | Law, GrokLaw, oder Lawyer. | La, oderaw | ||
? | passt auf ein beliebiges einzelnes Zeichen | ?at | Cat, cat, Batoderbat | at |
[abc] | entspricht einem Zeichen in der Klammer | [CB]at | CatoderBat | cat, batoderCBat |
[a-z] | entspricht einem Zeichen aus dem (lokalisierungsabhängigen) Bereich, der in der Klammer angegeben ist | Letter[0-9] | Letter0Letter1bis zuLetter2Letter9 | Letters, LetteroderLetter10 |
Normalerweise wird das Pfadtrennzeichen ( /unter Linux/Unix, MacOS usw. oder unter Windows) nie erkannt. Einige Shells, wie z. B. die Unix-Shell , bieten Funktionen, mit denen Benutzer dies umgehen können. [ 5 ]\
Unix-ähnlich
Auf Unix-ähnlichen Systemen ist wie oben definiert *, während zwei weitere Bedeutungen hat: [ 6 ] [ 7 ]?[…]
| Wildcard | Beschreibung | Beispiel | Spiele | Stimmt nicht überein |
|---|---|---|---|---|
[!abc] | entspricht einem Zeichen, das nicht in der Klammer angegeben ist | [!C]at | Bat, bat, odercat | Cat |
[!a-z] | entspricht einem Zeichen, das nicht aus dem in der Klammer angegebenen Bereich stammt. | Letter[!3-5] | Letter1, Letter2, Letter6bis zu Letter9und Letterxso weiter. | Letter3, Letter4, Letter5oderLetterxx |
Die Bereiche dürfen auch vordefinierte Zeichenklassen, Äquivalenzklassen für Akzentzeichen und Sortierzeichen für schwer einzugebende Zeichen enthalten. Sie sind so definiert, dass sie mit den Klammern in regulären POSIX-Ausdrücken übereinstimmen. [ 6 ] [ 7 ]
Unix-Globbing wird gemäß der POSIX-Tradition von der Shell gehandhabt . Globbing ist für Dateinamen in der Kommandozeile und in Shell-Skripten verfügbar . [ 8 ] Die POSIX-konforme caseAnweisung in Shells ermöglicht das Mustervergleichen mithilfe von Glob-Mustern.
Einige Shells (wie die C-Shell und Bash ) unterstützen zusätzliche Syntax, die als Alternation oder Klammererweiterung bekannt ist . Da diese nicht Teil der Glob-Syntax ist, wird sie nicht standardmäßig bereitgestellt case. Sie wird erst in der Befehlszeile vor dem Globing expandiert.
Die Bash-Shell unterstützt außerdem die folgenden Erweiterungen: [ 9 ]
- Erweiterte Globbing-Funktionalität (extglob): Ermöglicht die Verwendung anderer Mustervergleichsoperatoren, um mehrere Vorkommen eines in Klammern eingeschlossenen Musters zu finden. Dadurch werden im Wesentlichen die fehlenden Kleene-Stern- und Alternationsoperatoren zur Beschreibung regulärer Sprachen bereitgestellt. Die Funktion kann über eine Shell-Option aktiviert werden
extglob. Diese Option stammt aus ksh93. [ 10 ] Die GNU-Funktionen fnmatch und glob verfügen über eine identische Erweiterung. [ 3 ] - globstar: Ermöglicht
**als Namenskomponente das rekursive Durchsuchen beliebig vieler Ebenen nicht versteckter Verzeichnisse. [ 10 ] Wird auch von den JavaScript- Bibliotheken und dem Python -Befehl glob unterstützt.
Windows und DOS

dirBefehl mit einem Glob-Muster in IBM PC DOS 1.0.Das ursprüngliche DOS war ein Klon von CP/M, der für Intels 8088- und 8086 -Prozessoren entwickelt wurde. Windows-Shells führen, dem DOS-Modell folgend, traditionell keine Glob-Expansion in Argumenten durch, die an externe Programme übergeben werden. Shells können jedoch für ihre eigenen integrierten Befehle eine Expansion verwenden.
- Windows PowerShell enthält die gesamte gängige Syntax, wie oben beschrieben, ohne jegliche Zusätze. [ 11 ]
- COMMAND.COM und cmd.exe verwenden größtenteils dieselbe Syntax, jedoch mit einigen Einschränkungen:
[…]Bei COMMAND.COM gibt es kein „und“; dieses*darf nur am Ende des Musters stehen. Es darf nicht innerhalb eines Musters vorkommen, außer unmittelbar vor dem Punkt, der die Dateinamenerweiterung trennt.
Windows- und DOS-Programme erhalten anstelle von argv-Parametern eine lange Befehlszeilenzeichenkette und sind selbst für das Aufteilen, Setzen von Anführungszeichen oder die Glob-Expansion verantwortlich. Es gibt keine festgelegte Methode zur Beschreibung von Wildcards in Programmen, da diese frei gestaltet werden können. Zwei gängige Glob-Expander sind: [ 12 ]
- Der Microsoft C Runtime (msvcrt) Command-Line Expander unterstützt nur
?und*. [ 13 ] Sowohl ReactOS (crt/misc/getargs.c) als auch Wine (msvcrt/data.c) enthalten eine kompatible Open-Source-Implementierung von__getmainargs, der Funktion, die im Hintergrund arbeitet, in ihrer Core-CRT. - Der Cygwin- und MSYS-
dcrt0.ccBefehlszeilenexpander, derglob()intern die Unix-Routine verwendet, nachdem die Argumente aufgeteilt wurden.
Die meisten anderen Windows-Komponenten, einschließlich des Indizierungsdienstes, verwenden die MS-DOS-typischen Platzhalter aus der CMD. Diese Syntax, ein Überbleibsel aus der Zeit der Dateinamen in Windows 8.3, achtet besonders auf Punkte im Muster und im Text (Dateinamen). Intern wird dies mit drei zusätzlichen Platzhalterzeichen realisiert <>". In der Windows-API entspricht dies dem glob()Platzhalterzeichen `<svg> ` FindFirstFile(), das fnmatch()dem zugrundeliegenden Platzhalterzeichen `<svg>` entspricht RtlIsNameInExpression(). [ 14 ] (Ein weiteres fnmatch()Analogon ist ` PathMatchSpec()<svg>`.) Da beide Open-Source-msvcrt-Expander `<svg>` verwenden FindFirstFile(), gelten die Besonderheiten der Dateinamen in Windows 8.3 auch für sie.
SQL
Der SQL-LIKE Operator hat ein Äquivalent zu ?und, *aber nicht zu […].
| Häufige Wildcard | SQL-Platzhalter | Beschreibung |
|---|---|---|
? | _ | passt auf ein beliebiges einzelnes Zeichen |
* | % | entspricht einer beliebigen Anzahl beliebiger Zeichen, einschließlich keiner. |
Standard-SQL verwendet für einfache Zeichenkettenvergleiche in seinem LIKEOperator eine Glob-ähnliche Syntax, obwohl der Begriff „Glob“ in der SQL-Community nicht gebräuchlich ist. Das Prozentzeichen (% %) steht für null oder mehr Zeichen, der Unterstrich (" _) für genau ein Zeichen.
Viele SQL-Implementierungen haben den LIKEOperator erweitert, um eine reichhaltigere Mustererkennungssprache zu ermöglichen, die Zeichenbereiche ( […]), deren Negation und Elemente regulärer Ausdrücke einbezieht. [ 15 ]
Im Vergleich zu regulären Ausdrücken
Glob-Ausdrücke beinhalten keine Syntax für den Kleene-Stern , der mehrfache Wiederholungen des vorhergehenden Teils des Ausdrucks erlaubt; daher werden sie nicht als reguläre Ausdrücke betrachtet , die die gesamte Menge regulärer Sprachen über einem beliebigen endlichen Alphabet beschreiben können. [ 16 ]
| Häufige Wildcard | Äquivalenter regulärer Ausdruck |
|---|---|
? | . |
* | .* |
Glob-Muster versuchen, die gesamte Zeichenkette abzugleichen (zum Beispiel S*.DOCpassen sie auf S.DOC und SA.DOC , aber nicht auf POST.DOC oder SURREY.DOCKS ), während reguläre Ausdrücke je nach Implementierungsdetails auch nur eine Teilzeichenkette abgleichen können.
Implementierung als reguläre Ausdrücke
Die ursprüngliche Mozilla- Proxy-Autokonfiguration , die eine Glob-Matching-Funktion für Zeichenketten bereitstellt, verwendet wie oben beschrieben eine Replace-as-RegExp-Implementierung. Die Klammersyntax wird in diesem Beispiel zufällig von regulären Ausdrücken abgedeckt.
Die Python-Funktion fnmatch verwendet ein komplexeres Verfahren, um das Muster in einen regulären Ausdruck umzuwandeln. [ 17 ]
Andere Implementierungen
Neben ihrer Verwendung in Shells finden Glob-Muster auch in einer Vielzahl von Programmiersprachen Anwendung, hauptsächlich zur Verarbeitung menschlicher Eingaben. Eine Glob-ähnliche Schnittstelle zur Rückgabe von Dateien oder eine fnmatch-ähnliche Schnittstelle zum Abgleich von Zeichenketten finden sich in den folgenden Programmiersprachen:
- C und C++ verfügen in den von der ISO definierten Standardbibliotheken nicht über eine integrierte Unterstützung für Glob-Muster. Auf Unix-ähnlichen Systemen können C und C++ jedoch
<glob.h>die C POSIX-Bibliothek einbinden , um diese zu verwenden::glob().- C++ selbst bietet keine direkte Unterstützung für Glob-Muster, diese können jedoch mithilfe von
std::filesystem::directory_iteratorund approximiert werdenstd::regex_match(). - C++ verfügt über externe Bibliotheken, wie beispielsweise die POCO C++ Libraries
Poco::Glob, die eine Klasse enthalten , die auf Glob-Mustern operieren kann. [ 18 ]
- C++ selbst bietet keine direkte Unterstützung für Glob-Muster, diese können jedoch mithilfe von
- C# stellt eine offizielle Erweiterungsbibliothek bereit
Microsoft.Extensions.FileSystemGlobbing, [ 19 ] die die Klasse enthältMicrosoft.Extensions.FileSystemGlobbing.Matcher. [ 20 ] - D hat eine
std.path.globMatch()Funktion. [ 23 ] - Go hat eine
filepath.Glob()Funktion. [ 24 ] - Java bietet eine Klasse [ 25 ]
java.nio.file.Files, die Methoden wie zum Operieren über Glob-Muster besitzt und einen Wert zurückgibt . Die Klassen und werden ebenfalls zum Abgleich von Glob-Mustern verwendet.Files.newDirectoryStream(Pathdir,Stringglob)DirectoryStream<Path>java.nio.file.FileSystemsjava.nio.file.PathMatcher - Haskell verfügt über ein
GlobPaket mit dem HauptmodulSystem.FilePath.Glob. Die Mustersyntax basiert auf einer Teilmenge der Syntax von Zsh . Sie optimiert das gegebene Muster und sollte deutlich schneller sein als ein naiver, zeichenweiser Vergleich. [ 26 ] - Node.js verfügt über eine
globFunktion imnode:fsModul. [ 27 ] - Perl verfügt sowohl über eine
globFunktion (wie in Larry Walls Buch „Programming Perl “ beschrieben ) als auch über eine Glob- Erweiterung, die die BSD-Glob-Routine nachbildet. [ 28 ] Auch die spitzen Klammern von Perl können zum Globen verwendet werden:<*.log>. - PHP verfügt über eine
globFunktion. [ 29 ] - Python
globverfügt in der Standardbibliothek über ein Modul zur Wildcard-Mustererkennung von Dateinamen [ 30 ] sowie über einfnmatchModul mit Funktionen zum Abgleich von Zeichenketten oder zum Filtern von Listen anhand derselben Wildcard-Muster [ 17 ] . Guido van Rossum , der Autor der Programmiersprache Python, entwickelte und steuerte 1986 eineglobentsprechende Routine zu BSD Unix bei [ 31 ]. Frühere Implementierungen dieser Funktion fanden sichglobbeispielsweise in den Programmen `ex` und `ftp` früherer BSD-Versionen. - Ruby bietet eine
globMethode für dieDirKlasse, die Wildcard-Mustervergleiche für Dateinamen durchführt. [ 32 ] Mehrere Bibliotheken wie Rant und Rake bieten eineFileListKlasse mit einer glob-Methode oder verwenden die MethodeFileList.[]auf identische Weise. - Rust selbst bietet keine integrierte Unterstützung für Globbing, verfügt aber über mehrere Drittanbieterbibliotheken, die Glob-Muster abgleichen können [ 33 ]. Die bekannteste davon ist die
globCrate, die selbst eineglob()Funktion besitzt [ 34 ] . - SQLite verfügt über eine
GLOBFunktion. - Tcl enthält eine Globbing-Funktion. [ 35 ]
Siehe auch
Referenzen
- ^ „Unix-Handbuch der ersten Auflage, Abschnitt ‚Verschiedenes‘ (PDF)“ (PDF) . Archiviert vom Original (PDF) am 29.08.2000 . Abgerufen am 11.05.2011 .
- ^ McIlroy, MD (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (Technical report). CSTR. Bell Labs. 139.
- ^ a b – Linux Programmer's Manual – Library Functions
- ^ – Linux- Programmierhandbuch –Bibliotheksfunktionen
- ^ https://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching (Archiviert am 15.03.2018 im Internet Archive) Bash-Referenzhandbuch
- ^ a b „The Open Group Base Specifications Issue 7 IEEE Std 1003.1, 2013 Edition, 2.13. Pattern Matching Notation“ . Archiviert vom Original am 27.04.2014 . Abgerufen am 26.10.2015 .
- ^ a b „Linux Programmer's Manual, GLOB(7)“ . Archiviert vom Original am 31.10.2015 . Abgerufen am 26.10.2015 .
- ^ Der „Advanced Bash-Scripting Guide, Chapter 19.2: Globbing“ (Mendel Cooper, 2003) enthält eine prägnante Sammlung von Beispielen für Dateinamen-Globbing-Muster.
- ^ „Bash-Globs“ . Gregs Bash-Wissensdatenbank . Archiviert vom Original am 18.11.2019 . Abgerufen am 25.11.2019 .
- ^ a b „Mustervergleich“ . Bash-Referenzhandbuch . Archiviert vom Original am 11.02.2016 . Abgerufen am 11.01.2016 .
- ^ „Unterstützung von Platzhalterzeichen in Cmdlet-Parametern“ . Microsoft . Microsoft Developer Network. 18.12.2023.
- ^ „Wildcard-Erweiterung“ . Microsoft Developer Network. 2013. Archiviert vom Original am 22.08.2014 . Abgerufen am 16.10.2013 .
- ^ „Wildcard-Erweiterung“ . docs.microsoft.com . 08.02.2022.
- ^ Wildcards in Windows. Archiviert am 24.12.2019 in der Wayback Machine . MSDN Devblog.
- ^ "LIKE (Transact-SQL)" . 23.05.2023. Archiviert vom Original am 02.08.2017 . Abgerufen am 01.08.2017 .
- ^ Hopcroft, John E.; Motwani, Rajeev; Ullman, Jeffrey D. (2000). Einführung in die Automatentheorie, Sprachen und Berechnung (2. Aufl.). Addison-Wesley.
- ^ a b "Lib/fnmatch.py" . Python. 2021-01-20. Archiviert vom Original am 10.11.2021 . Abgerufen am 10.11.2021 .
- ^ "Class Poco::Glob" . docs.pocoproject.org . Abgerufen am 13.08.2025 .
- ^ „NuGet Gallery Microsoft.Extensions.FileSystemGlobbing“ . www.nuget.org . Abgerufen am 17.08.2025 .
- ^ „Dateiglobbing in .NET“ . learn.microsoft.com . Abgerufen am 17.08.2025 .
- ^ "kthompson/glob" . GitHub . Archiviert vom Original am 26.10.2020 . Abgerufen am 06.11.2020 .
- ^ "dazinator/dotnet.glob" . GitHub . Archiviert vom Original am 22.06.2022 . Abgerufen am 22.06.2022 .
- ^ "std.path - D Programming Language - Digital Mars" . dlang.org. Archiviert vom Original am 08.09.2014 . Abgerufen am 08.09.2014 .
- ^ „Paketdateipfad – Die Programmiersprache Go“ . Golang.org. Archiviert vom Original am 25.05.2011 . Abgerufen am 11.05.2011 .
- ^ „Dateioperationen“ . Oracle. Archiviert vom Original am 20.09.2013 . Abgerufen am 16.12.2013 .
- ^ „Glob-0.7.4: Globbing-Bibliothek“ . Archiviert vom Original am 08.05.2014 . Abgerufen am 07.05.2014 .
- ^ „Dateisystem – Node.js-Dokumentation“ . Archiviert vom Original am 16.07.2025 . Abgerufen am 16.07.2025 .
- ^ "File::Glob - Perl-Erweiterung für die BSD-Glob-Routine" . perldoc.perl.org . Abgerufen am 11.05.2011 .
- ^ "glob - Manual" . PHP. 06.05.2011. Archiviert vom Original am 13.11.2017 . Abgerufen am 11.05.2011 .
- ^ „10.7. glob – Unix-Pfadnamensmustererweiterung – Python v2.7.1 Dokumentation“ . Docs.python.org. Archiviert vom Original am 16.05.2011 . Abgerufen am 11.05.2011 .
- ^ "'Globbing'-Bibliotheksroutine“ . Archiviert vom Original am 19.12.2007 . Abgerufen am 11.05.2011 .
- ^ "Klasse: Dir" . Ruby-doc.org. Archiviert vom Original am 15.05.2011 . Abgerufen am 11.05.2011 .
- ^ "#glob - Lib.rs" . lib.rs . Archiviert vom Original am 12.11.2021 . Abgerufen am 12.11.2021 .
- ^ "glob - Lib.rs" . lib.rs . Abgerufen am 17.01.2025 .
- ^ „TCL glob manual page“ . Archiviert vom Original am 08.12.2011 . Abgerufen am 16.11.2011 .