Оригинальный текст: 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.