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.
І так, навіть експертам потрібно час від часу звертатися з документацією. Дивіться також цей класичний жарт .