Jak nazywa się symbol *. *?

Odpowiedzi:

20

Interpretacja *.*pod starymi systemami Windows / DOS

Znaczenie 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 ).

Interpretacja *.*w powłokach uniksowych

W 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 bashtej dotglobopcji można ustawić powłoki lub GLOBIGNOREzmienna może być ustawiona odpowiednio, ale to inna sprawa!

Graeme
źródło
1
Należy zauważyć, że obecne wersje systemu Windows wydają się zachowywać bardziej logicznie. W szczególności „Żadne znaki inne niż kropka, które występują po gwiazdce, nie mają żadnego efektu” nie są już prawdą; przynajmniej filtrując pliki w standardowym oknie dialogowym Otwórz plik w systemie Windows 7 według wzorca *7.*, otrzymuję wszystkie pliki, których ostatnim znakiem przed rozszerzeniem jest 7, i za pomocą *sa*, otrzymuję wszystkie pliki, które zawierają podciąg w sadowolnym 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).)
OR Mapper
1
@ORMapper, zaktualizowano nagłówki, aby to odzwierciedlić. To zachowanie jest wcześniejsze niż Windows 95, co jest w odpowiedzi (chociaż nagłówek wprowadzał w błąd).
Graeme,
11

Jest globw 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 *suż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 *spasują 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 .

Cuonglm
źródło
8

Gwiazdka *jest globw 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 dotglobustawiona jest opcja powłoki .

Kiedy używasz *.*, pasuje do wszystkiego, co:

  • nie zaczyna się od .
  • zawiera co najmniej jeden .

Możesz także skorzystać z Rozszerzenia nazw plików w instrukcji.

diabelnie
źródło
6

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ć.

Jozuego
źródło
4

*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).

Złotowłosa
źródło
3

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).

mattdm
źródło
Może to zabrzmieć dziwnie, ale dziękuję za wspomnienie o „gwiezdnej kropce”, dzięki czemu ta strona jest dostępna w wyszukiwarce Google!
Score_Under
3

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
Braiam
źródło
1
Twoja onlydotatend.sprawa na pewno pasuje?
Graeme,
@Graeme nope. touch 'onlydotatend.' && echo *.*nie zwraca
Braiam
1
Robi dla mnie! Na obu bashi dash. Jakiej powłoki używasz?
Graeme,
@Graeme zsh, a masz rację, bash nie.
Braiam
Właśnie wypróbowałem to w zshkonfiguracji waniliowej i tam też działa. Nie rozumiem, jak onlydotatend.nie można dopasować, czy istnieje opcja konfiguracji, która to robi?
Graeme