Odpowiedzi:
*.*
pod starymi systemami Windows / DOSZnaczenie tutaj jest bardziej związane z Windows / DOS niż z Unix / Linux. W starych systemach Windows / DOS był to wzór „wieloznaczny”. Wzory wieloznaczne zostały użyte do dopasowania nazw plików w podobny sposób, jak globusy uniksowe. Symbol *.*
wieloznaczny był powszechnie używany do dopasowania dowolnego pliku.
Podobnie jak w globusie uniksowym, *
dopasuje dowolną sekwencję znaków w nazwie pliku, ponieważ jako taka *
będzie pasować do dowolnego pliku. Jednak powodem, dla którego *.*
pasuje również do dowolnej nazwy pliku, są różnice w sposobie działania tych symboli wieloznacznych. Zgodnie z tym artykułem :
Znaki inne niż kropka występujące po gwiazdce nie mają żadnego efektu, ponieważ gwiazdka przesuwa kursor do pozycji 12, w którym to punkcie nic nie zmienia stanu parsowania, z wyjątkiem kropki, która usuwa trzy ostatnie pozycje i przesuwa kursor.
To zachowanie (nieco dziwne z perspektywy systemu Unix) oznacza, że kropka występująca po a *
nie jest w rzeczywistości zgodna z kropką, ale jest po prostu hackingiem, pozwalającym na dodanie większej liczby znaków do wzorca. Oznacza to, że dodanie kolejnego *
spowoduje dopasowanie dowolnego elementu na tych ostatnich trzech pozycjach.
Ma to trochę więcej sensu, gdy weźmie się pod uwagę, że składnia była używana w systemie DOS i starych systemach Windows przed Windows 95, który wymagał 8.3 nazw plików . Te nazwy plików mogą mieć tylko jedną kropkę i maksymalnie trzy znaki następujące po kropce. Większość, jeśli nie wszystkie pliki w systemie miałyby trzy znakowe rozszerzenie (chociaż technicznie krótsze lub żadne rozszerzenie nie było dozwolone), więc wydaje mi się, że warto *.*
było dopasować dowolny plik (przynajmniej z wypaczonej logiki Windowsey ).
*.*
w powłokach uniksowychW powłokach uniksowych, jak zauważyli inni, oznacza to „rozwinięcie nazwy ścieżki” lub „glob”. *
Nie ma dziwne skoki do zachowania końcowego, a tym samym nie prowadzi do następujących znaków jest ignorowane. *.*
wzorzec pasuje do każdej nazwy pliku zawierającej kropkę (z wyjątkiem początku). To na pewno nie będzie pasować do żadnego pliku, ponieważ w systemie Unix / Linux jest wiele plików, które nie mają rozszerzenia (lub zawierają kropkę, ponieważ jest to również dozwolone).
Powodem *.*
niezgodności kropki na początku nazw plików w Uniksie jest to, że umieszczenie kropki na początku polega na tym, że pliki są „ukryte”, a ukryte pliki są domyślnie wykluczane z globusów. Aby dopasować je w powłoce POSIX, kropka musi być wyraźnie umieszczona na początku wzorca. W bash
tej dotglob
opcji można ustawić powłoki lub GLOBIGNORE
zmienna może być ustawiona odpowiednio, ale to inna sprawa!
Jest glob
w bash, poniżej cytowałem z podręcznika bash:
bash - GNU Bourne-Again SHell
*
Dopasowuje dowolny ciąg, w tym ciąg zerowy. Gdy opcja powłoki globstar jest włączona i
*
jest używana w kontekście rozszerzenia nazwy ścieżki, dwa sąsiednie*s
użyte jako pojedynczy wzorzec będą pasować do wszystkich plików oraz zero lub więcej katalogów i podkatalogów. Jeśli następuje po nim/
, dwa sąsiednie*s
pasują tylko do katalogów i podkatalogów.
W takim przypadku *.*
dopasuj wszystkie pliki zawierające kropkę .
w nazwie.
Możesz zobaczyć więcej szczegółów tutaj .
Gwiazdka *
jest glob
w języku powłoki. Cytowanie z języka poleceń powłoki :
Gwiazdka (
'*'
) to wzorzec, który powinien pasować do dowolnego łańcucha, w tym łańcucha zerowego.
Jednak nie pasuje do nazw plików rozpoczynających się od, .
chyba że dotglob
ustawiona jest opcja powłoki .
Kiedy używasz *.*
, pasuje do wszystkiego, co:
.
.
Możesz także skorzystać z Rozszerzenia nazw plików w instrukcji.
Wiele osób pochodzących z systemu Windows uważa, że *.*
dotyczy wszystkich plików. Tak jest w systemie Windows. W systemie UNIX wszystkie pliki zawierają co najmniej 1 kropkę w nazwie. *
sam w sobie działa dobrze w systemie Windows (sięgając wstecz do wczesnego DOS); jednak stare podręczniki zostały opublikowane *.*
i wydaje się, że trudno jest je złamać.
*
to symbol wieloznaczny używany przez powłokę do przeprowadzania interpretacji nazw plików , znany również jako „globbing”. *
rozwija się do czegokolwiek, w tym do niczego (np. *.*
pasuje file.
, itp.). Innym typowym symbolem wieloznacznym jest ?
, który pasuje do dowolnego pojedynczego znaku.
Nie należy mylić funkcji tych symboli wieloznacznych z użyciem tych samych znaków w wyrażeniach regularnych (takich jak używane z grep).
To jest gwiazda-kropka-gwiazda - przynajmniej w świecie DOS (a później oczywiście Windows). W DOS kropka .
ma specjalne magiczne znaczenie, ponieważ nazwy plików są ośmioznakową bazą (później rozszerzoną, ale zostańmy starą szkołą) i trzyznakowym rozszerzeniem (które określało typ pliku). W Uniksie typ pliku jest zwykle definiowany przez pierwsze dwa bajty pliku (lub innej magii), a rozszerzenie ma charakter informacyjny, ale nie ma większego znaczenia. Z wyjątkiem sytuacji, gdy wszystko się rozmyło.
Tak więc w Uniksie nie ma specjalnego znaczenia. Gwiazdka jest znakiem „globowania” w powłokach uniksowych i jest symbolem wieloznacznym dla dowolnej liczby znaków (w tym zera). ?
jest kolejną popularną postacią globbing, pasującą dokładnie do dowolnej postaci.
*.*
pasuje do wszystkich nazw plików, które zawierają co najmniej jeden .
. Nie ma specjalnej nazwy ani żadnego znaczenia, podobnie jak *a*
lub *_*
. I *.?
pasowałby do wszystkich plików z kropką i dokładnie jednym znakiem po tej kropce. Istnieją również bardziej skomplikowane rozszerzone wzorce globowania - zobacz stronę podręcznika twojej powłoki.
„Słownik New Hackera” (rozszerzenie starego „pliku żargonu” MIT) zauważa, że „gwiazda” jest najczęstszą nazwą tego *
symbolu (po której następuje splat
), i myślę, że nadal jest to prawdą w praktyce i .
jest zdecydowanie powszechne ” kropka ”, więc chociaż nie ma on żadnego wewnętrznego znaczenia jako zlepionego symbolu, sekwencja jest nadal rozsądnie nazywana gwiazdą-kropką-gwiazdą w Uniksie. (Jest to po prostu mniej przydatne).
Tutaj są tak naprawdę 2 symbole, gwiazdka *
i kropka .
. Powłoki zwykle interpretują gwiazdkę tylko jako każdą postać, ale w wyrażeniu regularnym oznaczałoby to chciwy glob. W takim przypadku pasuje do wszystkiego, co nie kończy się lub zaczyna kropką, ale zawiera co najmniej jeden:
somefile.dot # match
.dot.between.words. # match
.onlydotatstart # don't match
onlydotatend. # match
.startandenddot. # don't match
onlydotatend.
sprawa na pewno pasuje?
touch 'onlydotatend.' && echo *.*
nie zwraca
bash
i dash
. Jakiej powłoki używasz?
zsh
konfiguracji waniliowej i tam też działa. Nie rozumiem, jak onlydotatend.
nie można dopasować, czy istnieje opcja konfiguracji, która to robi?
*7.*
, otrzymuję wszystkie pliki, których ostatnim znakiem przed rozszerzeniem jest7
, i za pomocą*sa*
, otrzymuję wszystkie pliki, które zawierają podciąg wsa
dowolnym miejscu w nazwie pliku i tak dalej. (W związku z tym artykuł zatytułowany jest zacytowanie Jak zrobił symbole wieloznaczne pracować w MS-DOS ? (Podkreślenie dodane przez siebie).)