- podczas określania
ls --directory a*
należy wymienić tylko katalogi zaczynające się oda*
- ALE wyświetla listę plików i katalogów zaczynających się od
a
Pytania :
- gdzie mogę znaleźć dokumentację na ten temat, poza tym
man
iinfo
gdzie, jak sądzę, dokładnie się przyjrzałem? - czy to działa tylko w BASH?
echo a*
wyświetli również listę plików zaczynających się oda
(jeśli istnieją). Żeby było bardziej jasne, że to niels
robi tego, ale bash.Odpowiedzi:
a*
I*a*
składnia jest realizowany przez powłokę, a nie przezls
komendę.Kiedy piszesz
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 sekwencjia1 a2 a3
i przekazać je jako argumenty dols
. Samols
polecenie nigdy nie widzi*
postaci; to widzi tylko trzy argumentya1
,a2
ia3
.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 ia3
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:
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 jakfind
) mogą wykonywać własne interpretacje symboli wieloznacznych; musisz zacytować argumenty, aby stłumić rozszerzenie powłoki: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ć:Jeśli zapomnisz
..
:a akurat
.log
w katalogu bieżącym znajdują się dokładnie dwa pliki, rozwinie się do:który zmieni nazwę
one.log
i zablokujetwo.log
.EDYCJA : A po 52 opiniach, akceptacji i odznace Guru, może powinienem właściwie odpowiedzieć na pytanie w tytule.
-d
Lub--directory
opcjals
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 argumentls
, 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
poda długą listę każdego pliku, którego nazwa zaczyna się oda
, oraz zawartości każdego katalogu, którego nazwa zaczyna się oda
. Jeśli chcesz tylko listę plików i katalogów, po jednej linii dla każdego, możesz użyć:co jest równoważne z:
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 Linuxiels
polecenie jest częścią pakietu GNU coreutils; jeśli maszinfo
polecenie, albo powinieninfo ls
lubinfo coreutils ls
powinien dać ci bardziej ostateczną i wyczerpującą dokumentację. Inne systemy, takie jak MacOS, mogą używać różnych wersjils
polecenia i mogą nie miećinfo
polecenia; dla tych systemów użyjman ls
. Ils --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 .
źródło
a*
rozwija się do listy wszystkich plików w bieżącym katalogu, których nazwy zaczynają sięa
.ls subdir/a*
echo
to. Jeśli więc chcesz wiedzieć, co się dzieje, wykonajls a*
najpierwecho ls a*
echo a*
... powłoka i tak dokonuje globalnej ekspansjishopt -s failglob
powoduje to samo zachowanie. Ustawienie,nullglob
ale niefailglob
powoduje, na przykład*nosuchfile*
rozwinięcia do pustego ciągu.Zobacz odpowiedź Keitha Thompsona; ale aby wyjaśnić, dlaczego
ls --directory a*
wyświetla pliki i katalogi: Ta--directory
opcja nie pomija plików spoza katalogu. Zamiast tego wyświetla katalogi jako takie, podczas gdy w przeciwnym razie wyświetlałoby ich zawartość. Przykład:źródło
-F
opcjąMówiąc wprost, jest to udokumentowane na stronie podręcznika ls (1) :
-d, --directory wyświetla pozycje katalogu zamiast zawartości i nie wyklucza dowiązań symbolicznych
szczerze mówiąc, „wpisy zamiast treści” mogłyby być bardziej objaśniające:
źródło
Globbing
Jak wyjaśniono, rozszerzenie
*
(i podobne rozszerzenia) nazywa sięglob
bing w żargonie uniksowym i zwykle jest cechą procesora poleceń (znanego jako „powłoka” w języku uniksowym). Tak więc globbing można stosować również w wielu innych miejscach; wpiszman 7 glob
w powłoce klasycznej dystrybucji Linuksa (lub zobacz to ), aby uzyskać więcej informacji oglob
bing.Na początku Unix
glob
był faktycznie implementowany przez osobny program o nazwie/etc/glob
(dokumentacja tego znajduje się na stronie 10 starego podręcznika UNIX ). Obecnie jest to procedura kodu dostarczana przez biblioteki kodów i jest powszechnie używana przez powłoki. Źródło : Wikipedia .Katalogi
Dlaczego
ls -d
lista plików, a także katalogów ...ls
Strona mężczyzna wyjaśnia, dlaczego tak się dzieje, ale z bardzo lakonicznym wyjaśnieniem. Oto próba rozszerzonego wyjaśnienia:Domyślnie
ls
wyświetla zawartość katalogów, gdy podano ich nazwy, i zrobi to samo w przypadku dowiązań symbolicznych do katalogów.-d
Opcja oznacza, „gdy imię (imiona) z katalogu (ach)” (które mogą być również podawane w sposób dorozumiany przezglob
Bing) , pokazują tylko _name_s z katalogu (ach), ale nie ich zawartość. Podobnie, jeśli podano (jawnie lub niejawnie ) nazwy dowiązań symbolicznych do katalogów , należy podać nazwę pliku dowiązania symbolicznego, a nie zawartość katalogu, do którego się odwołuje.O
-d
ile wiem, ta opcja nie ma nic wspólnego z tym, które przedmioty są na liście; można to zrobić (źródło: tutaj ) ofind
, tak:find . -maxdepth 1 -type d
. Nie jestem pewien, czy jest to dobry sposób tylko z GNUls
. Oto kilka przykładów użyciafind
polecenia.Podsumowując: domyślnie
ls
pokazuje zawartość katalogów po podaniu nazwy ścieżki.-d
zmienia to zachowanie, pokazując tylko nazwę katalogu, tak jak w przypadku standardowego pliku.źródło
Dokumentacja nie mówi, że wyszczególnia tylko pozycje katalogu bur, ale kiedy
ls
otrzymuje nazwę katalogu, wyświetla pozycję dir zamiast jej zawartości. Najlepszym sposobem na zrozumienie jest przykład:źródło
Dokumentacja jest częścią powłoki . W szczególności powłoka wykonuje różne rozszerzenia i podstawienia w określonej kolejności przed wykonaniem polecenia.
Sekwencja rozszerzeń słów dla powłoki zgodnej z Bourne to:
Tak więc
ls
polecenie nawet nie widzi*
znaków, argumenty są już rozszerzone o wszystkie pliki pasujące doa*
wzorca globu. W przeciwieństwie do systemu Windows, w którym każde polecenie wymagające globowania nazw plików musi implementować tę funkcję samodzielnie.źródło
Kluczowym słowem, którego potrzebujesz (
man bash
), jest „rozszerzenie nazwy ścieżki”.źródło