Подстановочные знаки используются для сопоставления нескольких файлов в оболочке. Два основных символа подстановки - *
и ?
. *
соответствует
любому количеству символов, поэтому *.jpg
будет расширен оболочкой до списка всех файлов с расширением .jpg. Важно понимать, что это расширение выполняется
оболочкой перед передачей списка файлов любой команде, которую вы вызвали. Если у вас есть два файла с именами in.txt и out.txt и вы выполняете
команду $ ls .txt, оболочка заменяет расширение с подстановочным знаком на список подходящих файлов, а затем вызывает команду, чтобы она
выполнилась: $ ls in.txt out.txt
.
Команда не знает, что был использован подстановочный знак. Другой часто используемый подстановочный знак - ?
, соответствующий любому одиночному
символу: a?c.txt
соответствует abc.txt или aBc.txt, но не ac.txt и abbc.txt. Один символ, который не совпадает с этими символами, - это
разделитель каталогов /
. *.txt
соответствует abc.txt, но не abc/def.txt; чтобы соответствовать последнему, вам нужен /.txt.
Некоторые оболочки, такие как ZShell, используют **
для соответствия любому символу, включая разделители каталогов, поэтому вы можете перечислить
файлы в текущем каталоге и в каталогах ниже него, используя:
$ ls **/*.jpg
Подстановочные знаки оболочки - это не то же самое, что регулярные выражения, хотя некоторые аспекты похожи. Оболочка также принимает диапазоны символов с помощью скобок:
$ ls [abcd]*
$ ls [a-d]*
В обоих случаях перечисляются все файлы, начинающиеся с a, b, c или d. А что произойдет, если у вас есть файл с символами *, [ или ? в имени? Обычно это не очень хорошая идея, но это может быть вне вашего контроля. Ответ заключается в том, чтобы «экранировать» подстановочный знак с помощью обратной косой черты. Если вы выполните следующую команду, оболочка проигнорирует подстановочный знак, и ls попытается показать файл с именем *.txt, хотя создание такого файла будет не самой лучшей идеей):
$ ls \*.txt