Оригинальный текст: 14 Wildcards Simple (But Important) Things To Remember Linux Scripting

Перевод: очень вольный, собственный

Оболочки командной строки Linux поддерживают различные маски, которые можно использовать для манипуляций с именами файлов для группировки их по заданному шаблону. К примеру, необходимо удалить 100 файлов в текущей папке, имеющих расширение .txt. Можно попробовать обработать их поодиночке. Однако, если с 10 файлами проделать это будет просто нудно, то с 100 – еще и займёт слишком много времени.

Гораздо лучшее решение – использовать для подобных целей маски символов. В данном случае нужно удалить файлы, имена которых заканчивается на .txt. При этом не важно, из каких цифр или букв состоит остальная часть файла. В данном случае маска символов – именно эта часть “не важно”. В имени файла оно может принимать любое значение.

Что такое маска?

Маска – это шаблон, эквивалентный по своему значению одному или сразу нескольким символам.

14 примеров использования масок в именах файлов

1. Один любой символ

С помощью команды ls (просмотр содержимого папки) продемонстрируем, как знак вопроса заменяет собой один любой символ
ozi@blog:~$ ls -l ?? -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 ak -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 ar -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 bs -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 lq -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 tz
ozi@blog:~$ ls -l a? -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 ak -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 ar
В данном примере было показано, что знак ‘?’ эквивалентен одному любому символу

2. Любая строка

Заменяет собой 0 и больше любых символов
ozi@blog:~$ ls -l *.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 123123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 45C.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 a123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 A123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 B45.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:57 ,.txt
ozi@blog:~$ ls -l *????.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 123123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 a123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 A123.txt

3. Один символ из определённого подмножества

С помощью квадратных скобок можно определить нужное нам подмножество символов
ozi@blog:~$ ls -l [1aB]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 123123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 a123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 B45.txt
ozi@blog:~$ ls -l ?[125]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 123123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 45C.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 a123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 A123.txt

4. Символ, который не входит в определённое множество

Подставив перед подмножеством восклицательный знак, можно исключить эти символы
ozi@blog:~$ ls -l [!1aB]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 45C.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 A123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:57 ,.txt
ozi@blog:~$ ls -l ?[!125]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 B45.txt
Примечание: во многих языках программирования ‘!’ обозначает отрицание или, по-простому, “не”.

5. Только буквы

Если нужно заменить только буквенные символы, то можно использовать специальную маску [:alpha:]
ozi@blog:~$ ls -l [[:alpha:]]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 a123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 A123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 B45.txt

6. Все символы, не обозначающие буквы

Знак ‘!’ применим и к специальным маскам
ozi@blog:~$ ls -l [![:alpha:]]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 123123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 45C.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:57 ,.txt

7. Символы нижнего регистра

Для обозначения маленьких букв используется специальная маска [:lower:]
ozi@blog:~$ ls -l [[:lower:]]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 a123.txt

8. Символы верхнего регистра

Для больших букв – [:upper:]
ozi@blog:~$ ls -l [[:upper:]]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 A123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 B45.txt

9. Только цифры (0 – 9)

Используя маску [:digit:] можно перечислить все цифры от 0 до 9.
ozi@blog:~$ ls -l [[:digit:]]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 123123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 45C.txt

10. Символы, которые не относятся к числам или буквам

Разнообразные знаки пунктуации – [:punct:]
ozi@blog:~$ ls -l [[:punct:]]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:57 ,.txt

11. Буквы и цифры

Если нужные символы относятся к цифрам и буквам – можно использовать специальную маску [:alnum:]
ozi@blog:~$ ls -l [[:alnum:]]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 123123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 45C.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 a123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 A123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 B45.txt

12. Пробел

Маска [:space:] эквивалентна символу пробела
ozi@blog:~$ ls *[[:space:]]*.txt ls: невозможно получить доступ к *[[:space:]]*.txt: Нет такого файла или каталога

Создадим файл, содержащий пробел
ozi@blog:~$ touch asd\ asd.txt

И проверим работу команды еще раз
ozi@blog:~$ls -l *[[:space:]]*.txt -rw-r--r-- 1 ozo ozo 0 июл 26 11:11 asd asd.txt

13. Оператор И

Объединить несколько команд можно с помощью оператора && (И). Если первая команда выполнится удачно, то запускается вторая.
ozi@blog:~$ ls -l && date -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 123123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 45C.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 a123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 A123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 ak -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 ar -rw-r--r-- 1 ozo ozo 0 июл 26 11:11 asd asd.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 B45.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 bs -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 lq -rw-r--r-- 1 ozo ozo 0 июл 26 10:57 ,.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 tz Вт июл 26 11:12:58 MSK 2016
ozi@blog:~$ lss && date bash: lss: команда не найдена

Хотя это и не относиться к теме статьи, но использование оператора && удобно на практике и значительно экономит время

14. Оператор ИЛИ

В отличии от оператора &&, оператор || (ИЛИ) используется тогда, когда нужно выполнить другую команду в случае неудачного завершения первой
ozi@blog:~$ ls -l || date -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 123123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 45C.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 a123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 A123.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 ak -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 ar -rw-r--r-- 1 ozo ozo 0 июл 26 11:11 asd asd.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:56 B45.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 bs -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 lq -rw-r--r-- 1 ozo ozo 0 июл 26 10:57 ,.txt -rw-r--r-- 1 ozo ozo 0 июл 26 10:54 tz
ozi@blog:~$ lss || date bash: lss: команда не найдена Вт июл 26 11:14:45 MSK 2016

Заключение

В данной статье не были перечислены все возможные маски символов и их способы применения, не была затронута тема объединения нескольких масок и многие другие. Но цель преследовалась другая – дать общие, простые, но полезные знания о работе в командной строке Linux.

Навигация по записям