Glob (programování) - glob (programming) - Wikipedia
v programování, glob vzory určují sady názvů souborů s zástupné znaky. Například Unix Bash shell příkaz textové soubory mv * .txt /
pohyby (mv
) všechny soubory s názvy končícími na .txt
z aktuálního adresáře do adresáře textové soubory
. Tady, *
je zástupný znak pro „libovolný tětiva znaků "a" * .txt
je glob vzor. Dalším běžným zástupným znakem je otazník (?
), což je jeden znak.
Kromě shody názvů souborů se globusy také široce používají pro porovnávání libovolných řetězců (shoda zástupných znaků ). V této funkci je společné rozhraní fnmatch
.
Původ

glob
- majitel je dmr
, zkratka pro Dennis Ritchie.Příkaz glob, zkratka globální, pochází z prvních verzí Bell Labs Unix.[1] Tlumočníci příkazů raných verzí Unixu (1. až 6. vydání, 1969–1975) se při rozšiřování spoléhali na samostatný program zástupné znaky v nekotovaných argumentech k příkazu: / etc / glob. Tento program provedl rozšíření a do příkazu dodal rozšířený seznam cest souborů k provedení.
Glob byl původně napsán v B programovací jazyk. Jednalo se o první kus hlavního unixového softwaru, který byl vyvinut v a programovací jazyk na vysoké úrovni.[2] Později byla tato funkce poskytována jako C funkce knihovny, glob ()
, používaný programy jako skořápka. Obvykle je definována na základě a fnmatch ()
funkce, která testuje, zda řetězec odpovídá danému vzoru. Obě funkce jsou součástí POSIX: funkce definované v POSIX.1 od roku 2001 a syntaxe definovaná v POSIX.2.[3][4] Myšlenka definovat samostatnou funkci shody začala s divoká kočka (zástupný znak), jednoduchá knihovna, která odpovídá řetězcům proti globům Bourne Shell.
Globusy tradičně neodpovídají skrytým souborům ve formě Unixu dotfiles; aby jim odpovídal, musí vzor výslovně začínat .
. Například, *
odpovídá všem viditelným souborům, zatímco .*
odpovídá všem skrytým souborům.
Syntax
Nejběžnější zástupné znaky jsou *
, ?
, a […]
.
Divoká karta | Popis | Příklad | Zápasy | Nesouhlasí |
---|---|---|---|---|
* | odpovídá libovolnému počtu libovolných znaků včetně žádného | Zákon* | Zákon , Zákony nebo Právník | GrokLaw , Los Angeles nebo aw |
*Zákon* | Zákon , GrokLaw nebo Právník . | Los Angeles nebo aw | ||
? | odpovídá libovolnému jednomu znaku | ?na | Kočka , kočka , Netopýr nebo netopýr | na |
[abc] | odpovídá jednomu znaku uvedenému v závorce | [CB] ve společnosti | Kočka nebo Netopýr | kočka nebo netopýr |
[a-z] | odpovídá jednomu znaku z rozsahu (v závislosti na místním nastavení) uvedeném v závorce | Písmeno [0-9] | Dopis0 , Dopis1 , Dopis2 až do Dopis9 | Písmena , Dopis nebo Dopis10 |
Ve všech případech znak oddělovače cesty (/
na Unixu nebo \
ve Windows) nebude nikdy uzavřeno.
Unixový
Na Unixový systémy *
, ?
je definována výše, zatímco […]
má dva další významy:[5][6]
Divoká karta | Popis | Příklad | Zápasy | Nesouhlasí |
---|---|---|---|---|
[! abc] | odpovídá jednomu znaku, který není uveden v závorce | [!Kočka | Netopýr , netopýr nebo kočka | Kočka |
[! a-z] | odpovídá jednomu znaku, který není z rozsahu uvedeného v závorce | Dopis [! 3-5] | Dopis1 , Dopis2 , Dopis6 až do Dopis9 a Letterx atd. | Dopis3 , Dopis4 , Dopis5 nebo Letterxx |
Rozsahy také mohou zahrnovat předdefinované třídy znaků, třídy ekvivalence pro znaky s diakritikou a symboly řazení pro znaky, které se nedají psát. Jsou definovány tak, aby odpovídaly hranatým závorkám v regulárních výrazech POSIX.[5][6]
Unix globbing je zpracován skořápka podle tradice POSIX. Globbing je uveden u názvů souborů na webu příkazový řádek a v shell skripty.[7] POSIX mandátem případ
příkaz ve skořápkách poskytuje porovnávání vzorů pomocí glob vzorů.
Některé granáty (např C shell a Bash ) podporují další syntaxi známou jako střídání nebo rozšíření výztuhy. Protože není součástí syntaxe glob, není poskytována v případ
. Rozbalí se pouze na příkazovém řádku před globováním.
Bash shell podporuje také následující rozšíření:[8]
- Rozšířený globbing (extglob): umožňuje použít další operátory porovnávání vzorů, aby odpovídaly více výskytům vzoru uzavřeného v závorkách, v podstatě poskytuje chybějící kleene hvězda a střídání pro popis běžných jazyků. Lze jej povolit nastavením
extglob
možnost shell. Tato možnost pochází z ksh93.[9] GNU fnmatch a glob má identickou příponu.[3] - globstar: umožňuje
**
samostatně jako komponenta názvu, která rekurzivně odpovídá libovolnému počtu vrstev skrytých adresářů.[9] Podporováno také knihovnami JS a globem Pythonu.
Windows a DOS

dir
příkaz se vzorem glob v IBM PC DOSWindows skořápky, následující DOS, neprovádějí tradičně žádné globální rozšíření v argumentech předávaných externím programům. Mušle mohou použít rozšíření pro vlastní vestavěné položky:
- Windows PowerShell má všechny běžné syntaxe definované jak je uvedeno výše bez jakýchkoli doplňků.[10]
- COMMAND.COM a cmd.exe mít většinu společné syntaxe s některými omezeními: Neexistuje žádná
[…]
a pro COMMAND.COM*
se mohou objevit pouze na konci vzoru, nikoli na začátku.
Programy Windows a DOS dostávají dlouhý řetězec příkazového řádku namísto parametrů ve stylu argv a je jejich odpovědností provádět jakékoli rozdělení, citování nebo glob expanzi. Technicky neexistuje pevný způsob popisu zástupných znaků v programech, protože si mohou dělat, co chtějí. Mezi dva běžné expandéry glob patří:[11]
- Expandér příkazového řádku Microsoft C Runtime (msvcrt), který pouze podporuje
?
a*
.[12] Oba ReactOS (crt / misc / getargs.c) a Víno (msvcrt / data.c) obsahují kompatibilní implementaci open-source z__getmainargs
, funkce pracující pod kapotou, v jejich základním CRT. - The Cygwin a MSYS
dcrt0.cc
expandér příkazového řádku, který používá unixový stylglob ()
rutina pod kapotou, po rozdělení argumentů.
Většina ostatních částí systému Windows, včetně služby indexování, používá styl zástupných znaků MS-DOS nalezených v CMD. Tato syntaxe, která je pozůstatkem stáří souboru 8,3, věnuje zvláštní pozornost tečkám ve vzoru a textu (název souboru). Interně se to děje pomocí tří zástupných znaků navíc, <>"
. Na konci Windows API se glob () ekvivalent je Najít první soubor, a fnmatch () odpovídá jeho podkladu RtlIsNameInExpression.[13] (Další analog fnmatch je PathMatchSpec.) Používají oba expandéry msvcrt s otevřeným zdrojovým kódem FindFirstFile, takže v nich bude platit i 8,3 název souboru.
SQL
The SQL JAKO
operátor má ekvivalent k ?
a *
ale ne […]
.
Společný zástupný znak | Zástupný znak SQL | Popis |
---|---|---|
? | _ | odpovídá libovolnému jednomu znaku |
* | % | odpovídá libovolnému počtu libovolných znaků včetně žádného |
Standardní SQL používá globálně podobnou syntaxi pro jednoduché porovnávání řetězců JAKO
operátor, ačkoli pojem „glob“ se v komunitě SQL obecně nepoužívá. Znak procenta (%
) odpovídá nule nebo více znakům a podtržítku (_
) odpovídá přesně jednomu.
Mnoho implementací SQL rozšířilo JAKO
operátor umožňující bohatší jazyk pro porovnávání vzorů zahrnující rozsahy znaků ([…]
), jejich negace a prvky regulárních výrazů.[14]
Ve srovnání s regulárními výrazy
Globy neobsahují syntaxi pro Kleene hvězda což umožňuje vícenásobné opakování předchozí části výrazu; proto nejsou brány v úvahu regulární výrazy, který může popsat celou sadu běžné jazyky přes jakoukoli danou konečnou abecedu.[15]
Společný zástupný znak | Ekvivalentní regulární výraz |
---|---|
? | . |
* | .* |
Globs se pokusí porovnat celý řetězec (například S * .DOC
odpovídá S.DOC a SA.DOC, ale nikoli POST.DOC nebo SURREY.DOCKS), zatímco v závislosti na podrobnostech implementace mohou regulární výrazy odpovídat podřetězci.
Implementace jako regulární výrazy
Původní Mozilla automatická konfigurace serveru proxy implementace, která poskytuje funkci glob-matching na řetězcích, používá implementaci replace-as-RegExp, jak je uvedeno výše. Syntaxe závorky je v takovém příkladu pokryta regexem.
Pythonův fnmatch používá komplikovanější postup k nahrazení vzoru regulárním výrazem.[16]
Implementace
Kromě jejich použití ve skořápkách najdou vzory globů také použití v různých programovacích jazycích, zejména ke zpracování lidského vstupu. Rozhraní ve stylu glob pro vracení souborů nebo rozhraní ve stylu fnmatch pro shodu řetězců se nachází v následujících programovacích jazycích:
- C# má knihovnu s názvem
Glob
který lze nainstalovat pomocí NuGet.[17] - D má
globMatch
funkce vstandardní cesta
modul.[18] - JavaScript má knihovnu s názvem
minimatch
který interně používá npm, amicromatch
, údajně optimalizovanější, přesnější a bezpečnější implementace globbingu, kterou používá babel a příze.[19][20] - Jít má
Glob
funkce vcesta k souboru
balík.[21] - Jáva má
Soubory
třída obsahující metody, které fungují na globálních vzorcích.[22] - Haskell má
Glob
balíček s hlavním modulemSystem.FilePath.Glob
. Syntaxe vzoru je založena na podmnožině Zsh Je. Snaží se optimalizovat daný vzor a měl by být znatelně rychlejší než naivní porovnávač znaků po znakech.[23] - Perl má obojí
glob
funkce (jak je popsáno v Larry Wall kniha Programování Perl ) a a Glob rozšíření, které napodobuje rutinu BSD glob.[24] Perlovy úhlové závorky lze použít také pro glob:<*.log>
. - PHP má
glob
funkce.[25] - Krajta má
glob
modul ve standardní knihovně, který provádí porovnávání zástupných znaků u názvů souborů,[26] afnmatch
modul s funkcemi pro shodu řetězců nebo filtrování seznamů založených na stejných vzorech zástupných znaků.[16] Guido van Rossum, autor programovacího jazyka Python, napsal a přispěl aglob
rutina do BSD Unix v roce 1986.[27] Byly provedeny předchozí implementaceglob
, např. v např a ftp programy v předchozích verzích BSD. - Rubín má
glob
metoda proDir
třída, která provádí porovnávání zástupných znaků se jmény souborů.[28] Několik knihoven jako Rant a Rake poskytuje aFileList
třída, která má metodu glob nebo tuto metodu používáSeznam souborů. []
identický. - SQLite má
GLOB
funkce. - Tcl obsahuje zařízení na globování.[29]
Viz také
Reference
- ^ „První vydání Unixové sekce„ Různé “(PDF) (PDF). Archivovány od originál (PDF) dne 2000-08-29. Citováno 2011-05-11.
- ^ McIlroy, M. D. (1987). Čtenář Research Unix: anotované výňatky z Programmer's Manual, 1971–1986 (PDF) (Technická zpráva). CSTR. Bell Labs. 139.
- ^ A b Linux Programátor Manuál - Funkce knihovny –
- ^ Linux Programátor Manuál - Funkce knihovny –
- ^ A b „The Open Group Base Specification Issue 7 IEEE Std 1003.1, 2013 Edition, 2.13. Pattern Matching Notation“.
- ^ A b „Linux Programmer's Manual, GLOB (7)“.
- ^ „Průvodce Advanced Bash-Scripting Guide, Kapitola 19.2: Globbing“ (Mendel Cooper, 2003) obsahuje výstižnou sadu příkladů vzorů globování souborů.
- ^ „Bash globs“. Greg's bash knowledgebase. Citováno 2019-11-25.
- ^ A b "Porovnávání vzorů". Referenční příručka Bash.
- ^ "Podpora zástupných znaků v parametrech rutiny". Microsoft. Microsoft Developer Network.
- ^ „Rozšíření zástupných znaků“. Microsoft Developer Network. 2013.
- ^ „Rozšíření zástupných znaků“. docs.microsoft.com.
- ^ Zástupné znaky ve Windows. MSDN Devblog.
- ^ „LIKE (Transact-SQL)“.
- ^ Hopcroft, John E .; Motwani, Rajeev; Ullman, Jeffrey D. (2000). Úvod do teorie automatů, jazyků a výpočtu (2. vyd.). Addison-Wesley.
- ^ A b „Lib / fnmatch.py“. Krajta. 2019-11-24. Citováno 2019-11-24.
- ^ „kthompson / glob“. GitHub. Citováno 2020-11-06.
- ^ "std.path - programovací jazyk D - Digital Mars". dlang.org. Citováno 2014-09-08.
- ^ "isaacs / minimatch". GitHub. Citováno 2016-08-10.
- ^ „jonschlinkert / micromatch“. GitHub. Citováno 2017-04-04.
- ^ "Cesta souboru balíčku - programovací jazyk Go". Golang.org. Citováno 2011-05-11.
- ^ "Operace se soubory". Věštec. Citováno 2013-12-16.
- ^ "Glob-0.7.4: Globbing library". Citováno 2014-05-07.
- ^ "File :: Glob - přípona Perl pro rutinu BSD glob". perldoc.perl.org. Citováno 2011-05-11.
- ^ "glob - manuální". PHP. 06.05.2011. Citováno 2011-05-11.
- ^ „10.7. Glob - rozšíření vzoru cesty ve stylu Unixu - dokumentace k Pythonu v2.7.1“. Docs.python.org. Citováno 2011-05-11.
- ^ "'Globbing 'rutina knihovny ". Archivovány od originál dne 19. 12. 2007. Citováno 2011-05-11.
- ^ „Class: Dir“. Ruby-doc.org. Citováno 2011-05-11.
- ^ "TCL glob manuální stránka". Citováno 2011-11-16.