Продвинутые методы Wildcard
Теперь, когда вы освоили основы, давайте рассмотрим некоторые более продвинутые шаблоны wildcard для выполнения более специфических операций с файлами.
Создание нового каталога для продвинутых операций
Сначала давайте создадим новый каталог для практики продвинутых методов:
cd ~/project/wildcards_lab
mkdir advanced
Использование классов символов с квадратными скобками
Классы символов позволяют сопоставить один символ из набора символов:
## Копирование файлов, которые начинаются с 'd' или 'f'
cp [df]*.* advanced/
Это копирует все файлы, начинающиеся с 'd' или 'f', в каталог advanced. Давайте проверим:
ls advanced/
Вывод:
data_01.csv data_02.csv data_03.csv doc1.pdf doc2.pdf file1.txt file2.txt file3.txt
Использование отрицания в классах символов
Вы можете использовать символ ! или ^ после открывающей скобки, чтобы отрицать класс символов. Давайте скопируем файлы, которые не начинаются с 'r' или 'i':
mkdir advanced/filtered
cp [^ri]*.txt advanced/filtered/
Давайте проверим:
ls advanced/filtered/
Вывод:
file1.txt file2.txt file3.txt
Комбинирование нескольких Wildcards
Давайте объединим разные wildcards, чтобы создать более конкретные шаблоны:
## Копирование файлов, которые начинаются с 'data_0', за которыми следует одна цифра, и заканчиваются на '.csv'
cp data_0?.csv advanced/
Давайте проверим, что это правильно скопировало наши CSV-файлы:
ls advanced/*.csv
Вывод:
advanced/data_01.csv advanced/data_02.csv advanced/data_03.csv
Использование расширенного Globbing
Bash предоставляет расширенные шаблоны globbing, которые более мощные, чем стандартные wildcards. Сначала включите расширенный globbing:
shopt -s extglob
Теперь мы можем использовать шаблоны, такие как:
?(pattern): Соответствует нулю или одному вхождению шаблона
*(pattern): Соответствует нулю или более вхождений
+(pattern): Соответствует одному или более вхождений
@(pattern): Соответствует ровно одному вхождению
!(pattern): Соответствует чему угодно, кроме шаблона
Давайте попробуем один пример:
## Копирование файлов, которые имеют число, за которым следует .txt
mkdir advanced/numbered
cp +([0-9])*.txt advanced/numbered/
Результат может быть пустым, так как наши исходные файлы не соответствуют этому точному шаблону. Давайте создадим файл, который соответствует:
touch 123file.txt
cp +([0-9])*.txt advanced/numbered/
ls advanced/numbered/
Вывод:
123file.txt
Использование расширения фигурных скобок для сложных шаблонов
Расширение фигурных скобок полезно для создания сложных шаблонов:
## Создание каталога для файлов отчетов
mkdir advanced/reports
## Копирование всех файлов отчетов и файлов конфигурации
cp {report*.txt,*.yml} advanced/reports/
Давайте проверим:
ls advanced/reports/
Вывод:
config.yml report1.txt report2.txt report_final.txt
Эти продвинутые методы помогут вам быть более точными при выборе файлов, экономя ваше время и усилия при управлении вашей файловой системой. Попробуйте поэкспериментировать с комбинациями этих wildcards, чтобы увидеть, как они могут помочь вам более эффективно управлять файлами.