a*
I *a*
składnia jest realizowany przez powłokę, a nie przez ls
komendę.
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 a3
i przekazać je jako argumenty do ls
. Samo ls
polecenie nigdy nie widzi *
postaci; to widzi tylko trzy argumenty a1
, a2
i a3
.
Do celów interpretacji symboli wieloznacznych „pliki” odnoszą się do wszystkich jednostek w bieżącym katalogu. Na przykład a1
może być normalnym plikiem, a2
może być katalogiem i a3
moż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 bash
i 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.bak
jest 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 .log
pliki do katalogu nadrzędnego, możesz wpisać:
mv *.log ..
Jeśli zapomnisz ..
:
mv *.log
a akurat .log
w katalogu bieżącym znajdują się dokładnie dwa pliki, rozwinie się do:
mv one.log two.log
który zmieni nazwę one.log
i zablokuje two.log
.
EDYCJA : A po 52 opiniach, akceptacji i odznace Guru, może powinienem właściwie odpowiedzieć na pytanie w tytule.
-d
Lub --directory
opcja ls
nie 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. -d
Opcja 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*
ls
poda 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 ls
polecenie nigdy nie widzi *
postaci.
Jeśli chodzi o to, gdzie jest to udokumentowane, man ls
pokaże ci dokumentację ls
polecenia na prawie każdym systemie uniksopodobnym. W większości systemów opartych na Linuxie ls
polecenie jest częścią pakietu GNU coreutils; jeśli masz info
polecenie, albo powinien info ls
lub info coreutils ls
powinien dać ci bardziej ostateczną i wyczerpującą dokumentację. Inne systemy, takie jak MacOS, mogą używać różnych wersji ls
polecenia i mogą nie mieć info
polecenia; dla tych systemów użyj man ls
. I ls --help
pokaż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 .