a*I *a*składnia jest realizowany przez powłokę, a nie przez lskomendę.
Kiedy piszesz
ls a*
po zachęcie powłoki powłoka rozwija się a*do listy istniejących wszystkich plików w bieżącym katalogu, których nazwy zaczynają się a. Na przykład może rozwinąć a*się do sekwencji a1 a2 a3i przekazać je jako argumenty do ls. Samo lspolecenie nigdy nie widzi *postaci; to widzi tylko trzy argumenty a1, a2i a3.
Do celów interpretacji symboli wieloznacznych „pliki” odnoszą się do wszystkich jednostek w bieżącym katalogu. Na przykład a1może być normalnym plikiem, a2może być katalogiem i a3może być dowiązaniem symbolicznym. Wszystkie mają wpisy w katalogu, a rozszerzenie symboli wieloznacznych powłoki nie ma znaczenia, do jakiego rodzaju encji odnoszą się te wpisy.
Praktycznie wszystkie powłoki, na które prawdopodobnie natkniesz się (bash, sh, ksh, zsh, csh, tcsh, ...) implementują symbole wieloznaczne. Szczegóły mogą się różnić, ale podstawowa składnia *dopasowywania zera lub więcej znaków i ?dopasowywania dowolnego pojedynczego znaku jest dość spójna.
W szczególności w przypadku bash jest to udokumentowane w sekcji „Rozszerzenie nazwy pliku” podręcznika bash; uruchom info bashi wyszukaj „Rozszerzenie nazwy pliku” lub zobacz tutaj .
Fakt, że robi to powłoka, a nie poszczególne polecenia, ma pewne interesujące (i czasem zaskakujące) konsekwencje. Najlepsze w tym jest to, że obsługa symboli wieloznacznych jest spójna dla (bardzo) wszystkich poleceń; jeśli powłoka tego nie zrobi, nieuchronnie niektóre polecenia nie zawracałyby sobie głowy, a inne robiłyby to w nieco inny sposób, który autor uważał za „lepszy”. (Myślę, że powłoka poleceń systemu Windows ma ten problem, ale nie znam go wystarczająco dobrze, aby komentować dalej.)
Z drugiej strony trudno jest napisać polecenie zmiany nazwy wielu plików. Jeśli napiszesz:
mv *.log *.log.bak
prawdopodobnie zawiedzie, ponieważ *.log.bakjest rozwijany na podstawie plików, które już istnieją w bieżącym katalogu. Istnieją polecenia, które robią takie rzeczy, ale muszą używać własnej składni, aby określić sposób zmiany nazwy plików. Niektóre polecenia (takie jak find) mogą wykonywać własne interpretacje symboli wieloznacznych; musisz zacytować argumenty, aby stłumić rozszerzenie powłoki:
find . -name '*.txt' -print
Rozszerzenie symboli wieloznacznych powłoki jest całkowicie oparte na składni argumentu wiersza poleceń i zestawie istniejących plików. To nie może być dotknięte rozumieniu polecenia. Na przykład, jeśli chcesz przenieść wszystkie .logpliki do katalogu nadrzędnego, możesz wpisać:
mv *.log ..
Jeśli zapomnisz ..:
mv *.log
a akurat .logw katalogu bieżącym znajdują się dokładnie dwa pliki, rozwinie się do:
mv one.log two.log
który zmieni nazwę one.logi zablokuje two.log.
EDYCJA : A po 52 opiniach, akceptacji i odznace Guru, może powinienem właściwie odpowiedzieć na pytanie w tytule.
-dLub --directoryopcja lsnie powiedzieć go do listy tylko katalogów. Mówi o tym, żeby wyświetlała katalogi tak jak one same, a nie ich zawartość. Jeśli podasz nazwę katalogu jako argument ls, domyślnie wyświetli ona zawartość katalogu, ponieważ zwykle jest to tym, co cię interesuje. -dOpcja ta nakazuje mu wyświetlić tylko sam katalog. Może to być szczególnie przydatne w połączeniu z symbolami wieloznacznymi. Jeśli wpiszesz:
ls -l a*
lspoda długą listę każdego pliku, którego nazwa zaczyna się od a, oraz zawartości każdego katalogu, którego nazwa zaczyna się od a. Jeśli chcesz tylko listę plików i katalogów, po jednej linii dla każdego, możesz użyć:
ls -ld a*
co jest równoważne z:
ls -l -d a*
Pamiętaj jeszcze raz, że lspolecenie nigdy nie widzi *postaci.
Jeśli chodzi o to, gdzie jest to udokumentowane, man lspokaże ci dokumentację lspolecenia na prawie każdym systemie uniksopodobnym. W większości systemów opartych na Linuxie lspolecenie jest częścią pakietu GNU coreutils; jeśli masz infopolecenie, albo powinien info lslub info coreutils lspowinien dać ci bardziej ostateczną i wyczerpującą dokumentację. Inne systemy, takie jak MacOS, mogą używać różnych wersji lspolecenia i mogą nie mieć infopolecenia; dla tych systemów użyj man ls. I ls --helppokaże stosunkowo krótki komunikat o użyciu (117 linii w moim systemie), jeśli używasz implementacji GNU coreutils.
I tak, nawet eksperci muszą od czasu do czasu sprawdzać dokumentację. Zobacz także ten klasyczny żart .