Подстановочные знаки используются для сопоставления нескольких файлов в оболочке. Два основных символа подстановки - * и ?. * соответствует любому количеству символов, поэтому *.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