Оригинальный текст: 14 Wildcards Simple (But Important) Things To Remember Linux Scripting
Перевод: очень вольный, собственный
Оболочки командной строки Linux поддерживают различные регулярные выражения, которые можно использовать для манипуляций с именами файлов для группировки их по заданному шаблону. К примеру, необходимо удалить 100 файлов в текущей папке, имеющих расширение .txt. Можно попробовать обработать их поодиночке. Однако, если с 10 файлами проделать это будет просто нудно, то с 100 – еще и займёт слишком много времени. Гораздо лучшее решение – использовать для подобных целей маски символов или регулярных выражений.
В данном случае нужно удалить файлы, имена которых заканчивается на .txt. При этом не важно, из каких цифр или букв состоит остальная часть файла. В данном случае маска символов – именно эта часть “не важно”. В имени файла оно может принимать любое значение.
Что такое маска символов или регулярное выражение в Linux?
Маска – это шаблон, эквивалентный по своему значению одному или сразу нескольким символам.
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]])
Если нужно заменить только буквенные символы, то можно использовать специальную маску [: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. Все символы, не обозначающие буквы ([![:alpha:]])
Знак ‘!’ применим и к специальным маскам
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:]])
Для обозначения маленьких букв используется специальная маска [: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.