Как копировать файлы с определенными шаблонами, используя wildcards в Linux

LinuxBeginner
Практиковаться сейчас

Введение

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 и продемонстрирует их практическое применение.

Сценарий

Представьте, что вы системный администратор, отвечающий за организацию каталога, содержащего различные типы файлов. Вам нужно:

  1. Определить и категоризировать файлы по типу
  2. Сделать резервную копию важных файлов
  3. Извлечь файлы на основе определенных шаблонов именования

Давайте смоделируем этот сценарий:

Создание смоделированного каталога проекта

Сначала давайте создадим новый каталог проекта с различными типами файлов:

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.

Вот основные навыки, которые вы приобрели:

  1. Использование базовых wildcards (*,?,[ ]) для сопоставления шаблонов файлов
  2. Копирование файлов с определенными расширениями или шаблонами именования
  3. Использование продвинутых методов wildcard для более точного выбора файлов
  4. Комбинирование нескольких wildcards и расширения фигурных скобок для сложных шаблонов
  5. Применение этих навыков для организации и управления файлами в практическом сценарии

Эти навыки значительно повысят вашу производительность при работе с командной строкой Linux, позволяя вам автоматизировать задачи управления файлами и эффективно организовывать вашу файловую систему. По мере продолжения работы с Linux эти методы wildcard станут бесценными инструментами в вашей повседневной работе.

Помните, что практика ведет к совершенству. Чем больше вы используете эти wildcards в своей повседневной работе, тем комфортнее и опытнее вы будете с ними.