Добавить в корзинуПозвонить
Найти в Дзене
Герман Геншин

Думаете, вы знаете всё о работе с файлами? Вот малоизвестный приём Linux, который взорвёт ваш мозг!

Глоббинг — это своего рода «регулярки» для имён файлов. О нём слышали почти все, но разобрались единицы, а ведь без глоббинга не обойтись ни одному уверенно чувствующему себя в терминале пользователю. Сейчас покажу, как наконец освоить эту фишку и превратить работу с папками в удовольствие. «Глоббинг» — это по сути расширенный поиск файлов по шаблону: вместо точного имени вы задаёте маску, и терминал сам находит всё подходящее. Обычно знакомство с этой возможностью начинается примерно так: Например, эта простая команда покажет все файлы с расширением «.txt» в текущей папке. Звёздочка * означает «любое количество любых символов, хоть ни одного», так что подойдут такие файлы: А вот эти файлы не появятся в списке: Скрытые файлы, начинающиеся с точки, здесь особый случай: чтобы их тоже найти, и шаблон должен начинаться с точки. Кроме *, есть ещё два важных символа. Знак ? заменяет ровно один любой символ, а [...] позволяет указать набор допустимых символов на этом месте (например, a-z — л
Оглавление

Глоббинг — это своего рода «регулярки» для имён файлов. О нём слышали почти все, но разобрались единицы, а ведь без глоббинга не обойтись ни одному уверенно чувствующему себя в терминале пользователю. Сейчас покажу, как наконец освоить эту фишку и превратить работу с папками в удовольствие.

Что такое глоббинг?

«Глоббинг» — это по сути расширенный поиск файлов по шаблону: вместо точного имени вы задаёте маску, и терминал сам находит всё подходящее.

Обычно знакомство с этой возможностью начинается примерно так:

Например, эта простая команда покажет все файлы с расширением «.txt» в текущей папке. Звёздочка * означает «любое количество любых символов, хоть ни одного», так что подойдут такие файлы:

А вот эти файлы не появятся в списке:

Скрытые файлы, начинающиеся с точки, здесь особый случай: чтобы их тоже найти, и шаблон должен начинаться с точки.

Кроме *, есть ещё два важных символа. Знак ? заменяет ровно один любой символ, а [...] позволяет указать набор допустимых символов на этом месте (например, a-z — любая маленькая буква, :digit: — любая цифра).

Всего с парой таких приёмов можно строить очень гибкие запросы. Например, команда ls [amz]*[:digit:].?? выведет все файлы, которые начинаются на a, m или z, заканчиваются цифрой, точкой и двухсимвольным расширением.

Иногда встречаются и фигурные скобки: ls *.{md,markdown} покажет файлы сразу с обоими расширениями. Технически это уже не глоббинг, а отдельный механизм (разветвлённая подстановка), но на практике они почти всегда используются вместе.

Как работает глоббинг?

Фильтрация файлов по шаблону — не задача самой программы, а забота командной оболочки (shell). Например, вы пишете ls *.txt — кажется, что именно команда ls ищет подходящие файлы. На самом деле всё работает иначе.

Shell ещё до запуска ls разворачивает «*.txt» в список имён файлов: «foo.txt», «hello.txt» и т.д., и именно этот список программа получает на вход. Для самой ls символы * и ? уже не играют роли — она их даже не видит!

Из-за этой особенности иногда бывает путаница, например, при работе с командой find:

Кажется, find должен найти все .txt-файлы в текущей папке и её подпапках. Но Bash ведёт себя иначе:

Чтобы увидеть, как Shell подставляет значения, попробуйте просто вывести ту же строку с помощью echo:

В результате find ругнётся на неизвестный параметр — и с первого взгляда непонятно, почему!

-2

Происходит это потому, что флаг -name ожидает только один шаблон (аргумент), а если shell уже превратил *.txt в список конкретных файлов, find теряется. Правильное решение — взять шаблон в кавычки:

Одинарные или двойные кавычки указывают shell не разворачивать шаблон, а передавать его find как есть.

Что ещё умеет глоббинг?

В Bash основа глоббинга — это знаки *, ? и [...], но есть и продвинутые шаблоны для особо сложных случаев. Они позволяют задавать повторения и приближают глоббинг к возможностям регулярных выражений.

Чаще всего расширенный режим уже включён, но если вдруг не работает (например, в некоторых версиях Bash на macOS), активировать его можно так:

Теперь доступны дополнительные шаблоны:

Например, (a) подберёт «a», «aa», «aaaa» — любое количество подряд символов «a». Маска README?(.md|.txt) найдет и «README.md», и «README.txt», и просто «README».

Если вы привыкли к обычным регуляркам, учтите: глоббинг всегда сравнивает шаблон со всем именем файла целиком. То есть (a) подойдёт только для файлов, полностью состоящих из букв «a».

Поскольку обработкой занимаются именно оболочка и её настройки, детали могут отличаться: обязательно смотрите справку к своей shell. Например, Zsh поддерживает ещё больше расширенных масок и умеет использовать фигурные скобки, как Bash:

Популярные оболочки вроде Bash и Zsh также умеют «рекурсивный глоббинг»: шаблон ** ищет нужные файлы не только в этой папке, но и во всех вложенных. Например, команда ls **/*.txt выведет все .txt-файлы где угодно, даже в подпапках:

-3

В Bash для этого нужно явно включить нужный режим:

Но даже базовые POSIX-шаблоны (?, * и [...]) уже заметно ускоряют работу с кучей файлов. А если освоите расширенные возможности оболочки — почувствуете себя повелителем порядка и освободите уйму времени для более интересных задач!

Если вам понравилась эта статья, подпишитесь, чтобы не пропустить еще много полезных статей!

Премиум подписка - это доступ к эксклюзивным материалам, чтение канала без рекламы, возможность предлагать темы для статей и даже заказывать индивидуальные обзоры/исследования по своим запросам!Подробнее о том, какие преимущества вы получите с премиум подпиской, можно узнать здесь

Также подписывайтесь на нас в: