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.
РЕДАКТИРОВАТЬ : И после 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 coreutils; если у вас есть infoкоманда, либо info lsили info coreutils lsдолжны дать вам более точную и полную документацию. Другие системы, такие как MacOS, могут использовать другие версии lsкоманды и могут не иметь infoкоманды; для этих систем используйте man ls. И ls --helpпокажет относительно короткое сообщение об использовании (117 строк в моей системе), если вы используете реализацию GNU coreutils.
И да, даже специалистам нужно время от времени обращаться к документации. Смотрите также эту классическую шутку .