Введение
Linux wildcards, также известные как шаблоны globbing, представляют собой специальные символы, используемые в оболочке для сопоставления и расширения имен файлов. Понимание того, как использовать эти мощные инструменты, может значительно повысить вашу эффективность при работе с командной строкой Linux. Этот учебник проведет вас через основы Linux wildcards и продемонстрирует, как использовать их для копирования файлов с определенными шаблонами, помогая вам оптимизировать задачи управления файлами.
Понимание основных Wildcards
В Linux wildcards — это специальные символы, которые помогают сопоставлять несколько файлов, используя шаблоны. Они особенно полезны, когда вам нужно управлять большим количеством файлов одновременно. Давайте рассмотрим наиболее распространенные wildcards, изучив файлы в нашем текущем каталоге.
Сначала давайте посмотрим все файлы, с которыми нам предстоит работать:
cd ~/project/wildcards_lab
ls
Вы должны увидеть список файлов с различными расширениями, например:
backup data_02.csv doc2.pdf file3.txt image3.jpg readme.md
config.yml data_03.csv documents images report1.txt report_final.txt
data_01.csv doc1.pdf file1.txt image1.jpg report2.txt script.sh
file2.txt image2.jpg
Wildcard Звездочка (*)
Звездочка * — самый распространенный wildcard. Она соответствует любому количеству символов (включая ноль). Давайте посмотрим, как это работает:
Чтобы вывести список всех текстовых файлов (заканчивающихся на .txt):
ls *.txt
Вы должны увидеть:
file1.txt file2.txt file3.txt report1.txt report2.txt report_final.txt
Чтобы вывести список всех файлов изображений (заканчивающихся на .jpg):
ls *.jpg
Вывод:
image1.jpg image2.jpg image3.jpg
Wildcard Вопросительный знак (?)
Вопросительный знак ? соответствует ровно одному символу. Давайте используем его для поиска файлов:
ls file?.txt
Эта команда выведет список файлов, которые начинаются с "file", за которым следует ровно один символ, и заканчиваются на ".txt".
Вывод:
file1.txt file2.txt file3.txt
Wildcard Квадратные скобки ([])
Квадратные скобки [] позволяют сопоставить любой один символ из указанного набора:
ls data_0[1-2].csv
Эта команда выводит список CSV-файлов, имена которых соответствуют "data_0", за которым следует либо 1, либо 2, затем ".csv".
Вывод:
data_01.csv data_02.csv
Вывод скрытых файлов
В Linux файлы, начинающиеся с точки (.), являются скрытыми файлами. Мы также можем использовать wildcards для их поиска:
ls .*
Вывод будет включать:
. .. .hidden_file1 .hidden_file2
Примечание: . и .. представляют текущий каталог и родительский каталог соответственно.
Попробуйте эти команды и наблюдайте за результатами. Понимание этих основных wildcards необходимо, прежде чем мы перейдем к их использованию для операций копирования файлов.
Копирование файлов с использованием Wildcards
Теперь, когда вы понимаете основные wildcards, давайте использовать их для эффективного копирования файлов. Общий синтаксис для копирования файлов:
cp [options] source_file(s) destination
Давайте создадим несколько организующих каталогов и попрактикуемся в копировании файлов с разными шаблонами.
Копирование всех файлов с определенным расширением
Давайте скопируем все текстовые файлы в каталог backup:
cd ~/project/wildcards_lab
cp *.txt backup/
Эта команда копирует все файлы, заканчивающиеся на .txt, в каталог backup. Давайте проверим:
ls backup/
Вы должны увидеть:
file1.txt file2.txt file3.txt report1.txt report2.txt report_final.txt
Копирование файлов, начинающихся с определенных шаблонов
Далее давайте скопируем все файлы изображений в каталог images:
cp image*.jpg images/
Это копирует все файлы, начинающиеся с "image" и заканчивающиеся на ".jpg", в каталог images. Давайте проверим:
ls images/
Вывод:
image1.jpg image2.jpg image3.jpg
Копирование файлов с несколькими шаблонами с использованием расширения фигурных скобок
Расширение фигурных скобок {pattern1,pattern2} позволяет указать несколько шаблонов. Давайте скопируем файлы PDF и CSV в каталог documents:
cp *.{pdf,csv} documents/
Эта команда копирует все файлы, заканчивающиеся на .pdf или .csv, в каталог documents. Давайте проверим:
ls documents/
Вывод:
data_01.csv data_02.csv data_03.csv doc1.pdf doc2.pdf
Копирование файлов с несколькими шаблонами с использованием or (||)
Мы также можем использовать оператор || для копирования файлов, соответствующих разным шаблонам:
cp report*.txt script.sh backup/
Это копирует все файлы, начинающиеся с "report" и заканчивающиеся на ".txt", а также файл script.sh, в каталог backup. Давайте проверим, что сейчас находится в каталоге backup:
ls backup/
Обновленный вывод:
file1.txt file2.txt file3.txt report1.txt report2.txt report_final.txt script.sh
Копирование файлов с сохранением атрибутов
При копировании файлов вы можете захотеть сохранить атрибуты, такие как метки времени и разрешения. Используйте опцию -p:
cp -p config.yml backup/
Чтобы убедиться, что атрибуты были сохранены:
ls -l config.yml
ls -l backup/config.yml
Метки времени и разрешения должны быть идентичны для обоих файлов.
Попробуйте поэкспериментировать с этими командами и изучите, как различные шаблоны wildcards помогают эффективно копировать файлы.
Продвинутые методы 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, чтобы увидеть, как они могут помочь вам более эффективно управлять файлами.
Практическое упражнение по управлению файлами
На этом заключительном этапе мы объединим все, что мы изучили, чтобы решить практическую задачу управления файлами. Это упражнение укрепит ваше понимание wildcards и продемонстрирует их практическое применение.
Сценарий
Представьте, что вы системный администратор, отвечающий за организацию каталога, содержащего различные типы файлов. Вам нужно:
- Определить и категоризировать файлы по типу
- Сделать резервную копию важных файлов
- Извлечь файлы на основе определенных шаблонов именования
Давайте смоделируем этот сценарий:
Создание смоделированного каталога проекта
Сначала давайте создадим новый каталог проекта с различными типами файлов:
cd ~/project/wildcards_lab
mkdir project_files
cd project_files
## Создание различных типов файлов
touch project_doc_v1.txt project_doc_v2.txt project_doc_final.txt
touch data_2023_01.csv data_2023_02.csv data_2023_03.csv
touch config_dev.yml config_test.yml config_prod.yml
touch backup_script_v1.sh backup_script_v2.sh
touch image001.png image002.png image003.png
touch .project_config .project_log
Давайте проверим наш каталог:
ls
Вывод:
backup_script_v1.sh config_prod.yml data_2023_02.csv image002.png project_doc_v1.txt
backup_script_v2.sh config_test.yml data_2023_03.csv image003.png project_doc_v2.txt
config_dev.yml data_2023_01.csv image001.png project_doc_final.txt
Примечание: Скрытые файлы (начинающиеся с .) не появятся в базовом выводе ls.
Организация файлов по типу
Теперь давайте создадим каталоги для разных типов файлов и организуем наши файлы:
## Создание каталогов
mkdir docs configs scripts data images backups
## Копирование текстовых документов в каталог docs
cp *doc*.txt docs/
## Копирование файлов конфигурации в каталог configs
cp *.yml configs/
## Копирование скриптов в каталог scripts
cp *.sh scripts/
## Копирование файлов данных в каталог data
cp *.csv data/
## Копирование изображений в каталог images
cp *.png images/
Давайте проверим нашу организацию:
echo "Documents:"
ls docs/
echo "Configurations:"
ls configs/
echo "Scripts:"
ls scripts/
echo "Data files:"
ls data/
echo "Images:"
ls images/
Вывод:
Documents:
project_doc_final.txt project_doc_v1.txt project_doc_v2.txt
Configurations:
config_dev.yml config_prod.yml config_test.yml
Scripts:
backup_script_v1.sh backup_script_v2.sh
Data files:
data_2023_01.csv data_2023_02.csv data_2023_03.csv
Images:
image001.png image002.png image003.png
Создание комплексной резервной копии
Давайте создадим комплексную резервную копию, которая включает все важные файлы:
## Создание резервной копии всех файлов, кроме изображений
cp !(*.png|*backup*) backups/
## Давайте посмотрим, что находится в нашем каталоге backups
ls backups/
Вывод:
config_dev.yml config_test.yml data_2023_01.csv data_2023_03.csv project_doc_final.txt project_doc_v2.txt
config_prod.yml data_2023_02.csv project_doc_v1.txt
Поиск файлов с определенными шаблонами
Теперь давайте найдем файлы, соответствующие определенным шаблонам:
## Найти все файлы с 2023 года
echo "Files from 2023:"
ls *2023*
## Найти все финальные или производственные версии
echo "Final/Production versions:"
ls *final* *prod*
## Найти все файлы версии 2
echo "Version 2 files:"
ls *v2*
Вывод:
Files from 2023:
data_2023_01.csv data_2023_02.csv data_2023_03.csv
Final/Production versions:
config_prod.yml project_doc_final.txt
Version 2 files:
backup_script_v2.sh project_doc_v2.txt
Практическое применение: создание пакета развертывания
Наконец, давайте создадим пакет развертывания, содержащий только производственные конфигурации и окончательную документацию:
mkdir deployment_package
cp *prod*.yml *final*.txt deployment_package/
## Проверим наш пакет развертывания
ls deployment_package/
Вывод:
config_prod.yml project_doc_final.txt
Поздравляем! Вы успешно завершили практическое упражнение по управлению файлами с использованием wildcards Linux. Эти навыки будут бесценны для эффективного управления файлами в среде Linux, автоматизации повторяющихся задач и эффективной организации вашей файловой системы.
Резюме
В этой лабораторной работе вы узнали, как эффективно использовать wildcards Linux для копирования и управления файлами с определенными шаблонами. Вы начали с базовых wildcards, таких как звездочка (*), вопросительный знак (?), и квадратные скобки ([]), а затем перешли к более продвинутым методам, таким как классы символов, отрицание и расширенный globbing.
Вот основные навыки, которые вы приобрели:
- Использование базовых wildcards (*,?,[ ]) для сопоставления шаблонов файлов
- Копирование файлов с определенными расширениями или шаблонами именования
- Использование продвинутых методов wildcard для более точного выбора файлов
- Комбинирование нескольких wildcards и расширения фигурных скобок для сложных шаблонов
- Применение этих навыков для организации и управления файлами в практическом сценарии
Эти навыки значительно повысят вашу производительность при работе с командной строкой Linux, позволяя вам автоматизировать задачи управления файлами и эффективно организовывать вашу файловую систему. По мере продолжения работы с Linux эти методы wildcard станут бесценными инструментами в вашей повседневной работе.
Помните, что практика ведет к совершенству. Чем больше вы используете эти wildcards в своей повседневной работе, тем комфортнее и опытнее вы будете с ними.



