a*І *a*синтаксис реалізується командним, а не по lsкоманді.
Коли ви вводите текст
ls a*
у запиті оболонки оболонка розширюється a*до списку існуючих усіх файлів у поточному каталозі, імена яких починаються з a. Наприклад, він може розширюватися a*до послідовності a1 a2 a3та передавати їх як аргументи ls. Сама lsкоманда ніколи не бачить *персонажа; він бачить тільки три аргументи a1, a2і a3.
В цілях розширення підстановки «файли» посилаються на всі об'єкти в поточному каталозі. Наприклад, це a1може бути звичайний файл, a2може бути каталог і a3може бути посилання. Усі вони мають записи каталогів, і розширення підстановки символів оболонки не має значення, до якого типу цих елементів вони відносяться.
Практично у всіх оболонках, які ви, швидше за все, натрапите на (bash, sh, ksh, zsh, csh, tcsh, ...), використовуйте символи. Деталі можуть відрізнятися, але основний синтаксис *відповідності нулю або більше символів та ?відповідності будь-якому одному символу є досить послідовним.
Зокрема для bash, це задокументовано у розділі "Розширення назви файлів" у посібнику з bash; запустіть info bashі знайдіть "Розширення імені файлу" або подивіться тут .
Те, що це робиться оболонкою, а не окремими командами, має деякі цікаві (а іноді й дивовижні) наслідки. Найкраще в цьому - те, що обробка символів підказки відповідає (майже майже) всім командам; якби оболонка не робила цього, неминуче деякі команди не турбували б, а інші робили це тонко іншими способами, які автор вважав «кращими». (Я думаю, що в командній оболонці Windows є ця проблема, але я недостатньо знайомий з нею для коментарів.)
З іншого боку, складно написати команду перейменувати кілька файлів. Якщо ви пишете:
mv *.log *.log.bak
це, ймовірно, не вдасться, оскільки *.log.bakрозширюється на основі файлів, які вже є в поточному каталозі. Є команди, які роблять подібні речі, але вони повинні використовувати власний синтаксис, щоб вказати, як файли потрібно перейменовувати. Деякі команди (наприклад, find) можуть зробити власне розширення підстановки; Ви повинні навести аргументи для придушення розширення оболонки:
find . -name '*.txt' -print
Розширення підстановки символів оболонки повністю засноване на синтаксисі аргументу командного рядка та наборі існуючих файлів. На це не може вплинути значення команди. Наприклад, якщо ви хочете перемістити всі .logфайли до батьківського каталогу, ви можете ввести:
mv *.log ..
Якщо ви забудете ..:
mv *.log
і .logв поточному каталозі буде рівно два файли, він розшириться до:
mv one.log two.log
який буде перейменовувати one.logі клобувати two.log.
EDIT : І після 52 заявок, прийому та значка Гуру, можливо, я повинен насправді відповісти на питання в заголовку.
-dАбо --directoryваріант lsне сказати це тільки список каталогів. Це дозволяє йому перелічувати каталоги так само, як їх самі, а не їх зміст. Якщо ви даєте ім'я каталогу в якості аргументу ls, за замовчуванням він відображатиме вміст каталогу, оскільки це, як правило, те, що вас цікавить. Ця -dопція пропонує йому перелічити лише сам каталог. Це може бути особливо корисним у поєднанні із символами підстановки. Якщо ви введете:
ls -l a*
lsдасть вам довгий перелік кожного файлу, з якого починається ім’я a, та вмісту кожного каталогу, з якого починається ім'я a. Якщо ви просто хочете, щоб список файлів і каталогів, один рядок для кожного, ви можете використовувати:
ls -ld a*
що еквівалентно:
ls -l -d a*
Згадайте ще раз, що lsкоманда ніколи не бачить *персонажа.
Що стосується того, де це зафіксовано, man lsпокаже вам документацію для lsкоманди майже про будь-яку систему, схожу на Unix. У більшості систем на базі Linux lsкоманда є частиною пакету основних ядер GNU; якщо у вас є infoкоманда, info lsабо info coreutils lsви повинні дати вам більш чітку та вичерпну документацію. Інші системи, такі як MacOS, можуть використовувати різні версії lsкоманди і можуть не мати infoкоманди; для цих систем використовуйте man ls. І ls --helpбуде показано відносно коротке повідомлення про використання (117 рядків у моїй системі), якщо ви використовуєте реалізацію CoreNutil GNU.
І так, навіть експертам потрібно час від часу звертатися з документацією. Дивіться також цей класичний жарт .