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.
И да, даже специалистам нужно время от времени обращаться к документации. Смотрите также эту классическую шутку .