Как использовать знаки подстановки в терминале Linux для списка файлов
Вы могли увидеть странные символы в командах оболочки, но что они могут делать? Их называют «подстановочными знаками» и они могут значительно облегчить вашу жизнь в терминале Linux.
Что такое символы подстановки?
Шаблонные символы, также известные как метасимволы, — это символы, которые могут представлять другие символы. Они похожи на «шаблоны» в карточных играх, которые могут использоваться вместо других типов карт.
Символьные подстановки используются для генерации списков имен файлов, которые передаются другим утилитам. Если у вас есть большое количество файлов, с которыми вы хотите работать, вы можете использовать операцию с подстановочными символами, чтобы сэкономить время на наборе.
Это оболочка, которая обрабатывает эти операции, а не программы. Если вы вводите выражение с символами подстановки, оболочка увидит его и подставит подходящие файлы, а затем передаст это программе. Программа не увидит символы подстановки.
Разные оболочки имеют разные символы подстановки. Первые две операции, сопоставление одного символа и сопоставление нескольких символов, наиболее широко поддерживаются. Другие оболочки имеют более сложные операции. Хотя Bash является самой распространенной оболочкой в системах Linux, zsh известна своими продвинутыми операциями с символами подстановки, что является одной из причин её популярности среди опытных пользователей.
На практике вы можете использовать многие из тех же опций, если у вас есть относительно современная оболочка. Многие оболочки заимствуют функции друг у друга. Bash наследует много опций от оболочки Bourne. Bash и zsh в значительной степени подвержены влиянию оболочки Korn, или ksh.
Чтобы использовать некоторые из этих выражений, вам, возможно, придется включить опцию в настройках оболочки, которая включает «расширенную глоттинг». Это будет зависеть от оболочки, которую вы используете. Вам может понадобиться использовать команду setopt в zsh или shopt в Bash.
Указание одного символа: «?»
Самая простая операция с подстановочным знаком заключается в сопоставлении одного символа с символом "?" (вопросительный знак).
Предположим, у вас есть директория, заполненная скриптами на Perl и Python. Расширение файлов для Perl — .pl, а для Python — .py. Если бы вы хотели перечислить несколько фотографий в формате JPEG с именами, такими как photo_01, photo_02 и так далее, вы могли бы сделать это следующим образом:
ls photo.0?.jpg
Если ни один шаблон не совпадает, вы можете получить пустую строку или сообщение об ошибке, которое говорит, что совпадений не найдены.
Сопоставление нескольких символов с "*"
Самая распространенная операция с подстановочными знаками — это сопоставление нескольких символов с символом «*» (звездочка). Это также известно как «глоббинг». В то время как «?» сопоставляет ровно один символ, «*» может сопоставлять ноль или более символов в именах файлов. В зависимости от того, как настроен ваш оболочка, вы можете получить сообщение об ошибке, если совпадений не найдено.
Например, чтобы увидеть все файлы JPEG в текущем рабочем каталоге, вы можете ввести:
ls *.jpg
Вы также можете соответствовать в каталогах:
ls photos/*.jpg
Вы также можете объединить это с совпадением для одиночного символа выше. Чтобы сопоставить скрипты Perl и Python, которые оба заканчиваются на .pl и .py, введите:
ls *.p?
Вы можете находить символы посреди строк, а не только в конце. Чтобы найти букву «d» посреди слова
ls *d*
Если вы используете zsh, вы можете рекурсивно сопоставлять, перечисляя файлы в подкаталогах. Например, чтобы перечислить все файлы в подкаталогах домашних директорий:
ls ~/**
Вы также можете выполнять рекурсивный поиск в других именах путей
ls /usr/**/bin
Опция «***» (три астериска) будет искать как через символические ссылки, так и через подкаталоги.
Если вы когда-либо использовали MS-DOS или командную строку в Windows, вы могли привыкнуть к шаблону подстановки «*.*», чтобы перечислить все файлы в текущем каталоге. Это конструкция лишняя в Linux, так как звёздочка будет соответствовать всем файлам в каталоге.
Чтобы скопировать все файлы в другую директорию, вы можете использовать эту команду:
cp * /other/directory
Будьте осторожны с подстановочными знаками в списках директорий при использовании деструктивных команд, таких как rm. Удаление с помощью этой команды является постоянным. Храните резервные копии, чтобы вы могли восстановить свои файлы, если сделали ошибку.
Сопоставление диапазонов символов с помощью скобок
Вы также можете сопоставлять диапазоны символов, заключив их в квадратные скобки.
Чтобы найти соответствие, которое включает символы a, b и c, вы бы использовали эту конструкцию:
[abc]
Вы можете включать диапазоны символов, не указывая их, с помощью знака тире. Например, чтобы сопоставить все строчные буквы от a до z:
[a-z]
А для заглавных букв:
[A-Z]
Вы также можете сопоставлять диапазоны цифр таким образом:
[0-9]
Вы также можете комбинировать совпадения. Чтобы сопоставить любой символ верхнего и нижнего регистра:
[a-zA-Z]
И любой алфавитно-цифровой символ:
[a-zA-Z0-9]
Чаще всего они используются в сочетании с другими символьными подстановками. Например, чтобы сопоставить любые скрипты на Python или Perl, мы могли бы записать наш предыдущий пример так:
ls *.p[ly]
Это соответствовало бы любому файлу, содержащему точку, за которой следует буква p, а затем буква l или y.
Еще одно распространенное использование — находить файлы, имена которых начинаются с определенного шаблона. Чтобы найти файлы в текущем каталоге, имена которых начинаются с py.
В более современных оболочках, таких как Bash и zsh, вы также можете использовать фигурные скобки для сопоставления шаблонов.
Напечатать слова «кот» и «собака»
echo {cat,dog}
Вы также можете указать последовательность чисел и букв с двумя точками, или «..». Например, чтобы напечатать буквы «a» через «d» в алфавитном порядке:
echo {a..d}
Вы также можете сделать то же самое с числами. Чтобы напечатать числа от 1 до 10:
echo {1..10}
Это будет расширяться на все слова, которые вы укажете с помощью фигурных скобок и запятых. Если вы используете команду, такую как ls, и совпадение имени файла не существует, вы получите сообщение об ошибке.
Чередование матчей с скобками
Вместо поиска через «и» с фигурными скобками, вы можете использовать круглые скобки и символ «|» (не путать с символом канала), чтобы указывать «или» в поиске. Это означает, что вы можете сопоставлять чередующиеся выражения.
Чтобы сопоставить шаблон, начинающийся с нуля или более символов, вы можете начать с упомянутой ранее звездочки.
Чтобы снова сопоставить скрипты Perl и Python:
ls *.(pl|py)
Или альтернативно:
.*p(l|y)
Шаблон +(a|b) будет соответствовать шаблону, который начинается с одного или нуля символов, за которыми следует "a" или "b." Чтобы сопоставить ровно один символ, используйте "@" (символ "собака").
Исключая совпадения с «!» и «^»
В указанном выше выражении в скобках вы можете не только задавать диапазоны символов, но и искать символы, которые не соответствуют этим диапазонам. Вы можете сделать это, используя символ крышки (^) или восклицательный знак (!).
Например, чтобы найти имена файлов, которые не содержат строчные буквы:
ls [!a-z]
В качестве альтернативы вы можете использовать:
[^a-z]
В чередующихся образцах с скобками вы можете найти шаблоны, которые не совпадают, используя восклицательный знак:
!(a|b|c)
Отключение подстановочных знаков с помощью кавычек
Вы можете отключить эти выражения, используя кавычки. Это удобно, когда символы, которые вы передаете, имеют значение, такие как регулярные выражения для grep.
Вы можете использовать одинарные кавычки, чтобы отключить расширение, когда у вас нет переменных оболочки, которые вы хотите развернуть. Например, предположим, что вы хотите сопоставить шаблон с помощью grep в начале строки, который использует символ каретки. Этот символ уже используется для подстановочных знаков для отрицания ранее. Вы можете отключить это с помощью одинарных кавычек:
grep '^foo'
Если вы хотите включить переменную оболочки, вы можете использовать двойные кавычки. Предположим, вы искали шаблон, используя выражение, которое вы сохранили в переменной. Вам просто нужно использовать двойные кавычки вместо этого.
grep "^$expression"
С помощью этих подстановочных знаков вы можете значительно упростить работу с файлами из командной строки Linux. Хотя оператор «*» вероятно будет вашим основным инструментом, знание более obscure варианты может помочь вам сопоставлять файлы с изяществом.








Добавить комментарий