Если вы занимаетесь администрированием Linux серверов, в частности серверов, на которых размещаются сайты, вам часто приходится работать с большим количеством файлов.
В этом случае очень помогает команда rsync — мощный инструмент для быстрого и эффективного переноса данных. В прошлой статье мы рассмотрели базовые случаи использование данной утилиты.
Сегодня я расскажу, как правильно использовать rsync с опциями include и exclude, чтобы выбрать только нужные файлы и папки, а также приведу много примеров с подробными пояснениями.
Общая информация
rsync — это программа для копирования и синхронизации файлов между серверами или внутри одной машины.
Она умеет переносить только изменённые части файлов, что значительно ускоряет процесс и экономит трафик. Благодаря гибким настройкам, rsync позволяет точно управлять тем, что копировать, а что — пропускать.
Зачем нужны include и exclude?
Иногда нужно скопировать не все файлы из папки, а только определённые типы или исключить ненужные. Например:
- Копировать только картинки формата jpg и png
- Исключить временные файлы *.tmp
- Скопировать только папки с определёнными названиями
Для этого используют опции –include (включить) и –exclude (исключить). Они позволяют задать правила выбора файлов.
Как работают include и exclude?
Опция –include говорит программе включить в копирование файлы или папки, соответствующие заданному шаблону.
Опция –exclude говорит исключить из копирования файлы или папки по шаблону.
Важно помнить: порядок этих правил важен. Обычно сначала задают исключения, а потом включения, чтобы точно контролировать выбор.
Практические примеры
- Пример 1: копирование только изображений jpg и png
- Пример 2: копирование с сохранением структуры директорий
- Пример 3: копирование только определённых папок
- Пример 4: исключение файлов из копирования
- Пример 5: комбинирование include и exclude для сложных сценариев
У нас подготовлено тестовое окружение следующего вида:
[root@waky practice]# ls -R
.:
destination source
./destination:
./source:
dir1 dir2
./source/dir1:
file1.log picture1.jpg picture1.png text1.txt
./source/dir2:
file2.log picture2.jpg picture2.png text2.txt
[root@waky practice]#
Директория destination пустая, директория source содержит две подпапки, в которых находятся по четыре файла с разными расширениями.
После каждого копирования мы будем удалять содержимое директории destination следующей командой:
[root@waky practice]# rm -rf ./destination/*
Так мы сможем наблюдать результат исполнения каждого отдельного примера.
Пример 1: копирование только изображений jpg и png
Директория источник source содержит две папки dir1 и dir2 с разными файлами: log, jpg, png и txt. Мы хотим скопировать в папку назначения destination только изображения форматов jpg и png:
[root@waky practice]# rsync -va --include='*.jpg' --include='*.png' --exclude='*' ./source/*/ ./destination/
sending incremental file list
./
picture1.jpg
picture1.png
picture2.jpg
picture2.png
sent 334 bytes received 95 bytes 858,00 bytes/sec
total size is 0 speedup is 0,00
[root@waky practice]# ls destination/
picture1.jpg picture1.png picture2.jpg picture2.png
[root@waky practice]#
Объяснение:
./source/*/ – все подпапки
-a — архивный режим (сохраняет права, даты)
-v — выводит подробную информацию
–include=’*.jpg’ — включает все файлы с расширением jpg
–include=’*.png’ — включает все файлы с расширением png
–exclude=’*’ — исключает всё остальное
rsync сначала ищет файлы по правилам: включает jpg и png, а всё остальное игнорирует. В результате в целевую папку попали только файлы картинок.
Пример 2: копирование с сохранением структуры директорий
Как вы могли заметить, все картинки оказались в одной основной директории, это случилось из за того, что подпапки были так же исключены из копирования правилом –exclude=’*’.
Если вы хотите сохранить структуру папок, добавьте еще одно условие –include=’*/’:
[root@waky practice]# rsync -va --include='*/' --include='*.jpg' --include='*.png' --exclude='*' ./source/ ./destination/
sending incremental file list
./
dir1/
dir1/picture1.jpg
dir1/picture1.png
dir2/
dir2/picture2.jpg
dir2/picture2.png
sent 379 bytes received 107 bytes 972,00 bytes/sec
total size is 0 speedup is 0,00
[root@waky practice]# ls -R destination/
destination/:
dir1 dir2
destination/dir1:
picture1.jpg picture1.png
destination/dir2:
picture2.jpg picture2.png
[root@waky practice]#
Объяснение:
–include=’*/’ — знак / означает директорию, а * означает любой
Утилита скопирует все директории, а файлы в них, если те, удовлетворяют условию.
Пример 3: копирование только определённых папок
Допустим, нам нужно скопировать только часть поддиректорий, тогда остальные достаточно пометить на исключение:
[root@waky practice]# rsync -av --exclude='dir1/' ./source/ ./destination/
sending incremental file list
./
dir2/
dir2/file2.log
dir2/picture2.jpg
dir2/picture2.png
dir2/text2.txt
sent 353 bytes received 103 bytes 912,00 bytes/sec
total size is 0 speedup is 0,00
[root@waky practice]# ls -R destination/
destination/:
dir2
destination/dir2:
file2.log picture2.jpg picture2.png text2.txt
[root@waky practice]#
Объяснение:
–exclude=’dir1/’ — исключает директорию ‘dir1
В нашем случае подпапок всего две и пример довольно тривиальный, но при большем количестве директорий, достаточно лишь добавить правила –exclude для всех директорий, которые не хотите копировать.
Пример 4: исключение файлов из копирования
Допустим, вы хотите скопировать всю подпапку dir2, но исключить все файлы логов .log
[root@waky practice]# rsync -av --exclude='dir1/' --exclude='*.log' ./source/ ./destination/
sending incremental file list
./
dir2/
dir2/picture2.jpg
dir2/picture2.png
dir2/text2.txt
sent 290 bytes received 84 bytes 748,00 bytes/sec
total size is 0 speedup is 0,00
[root@waky practice]# ls -R destination/
destination/:
dir2
destination/dir2:
picture2.jpg picture2.png text2.txt
[root@waky practice]#
Объяснение:
–exclude=’*.log’ – исключить файлы с расширением .log
Данное условие скажет rsync пропускать все файлы с расширениями . log при копировании.
Пример 5: комбинирование include и exclude для сложных сценариев
Вся мощь rsync как инструмента копирования раскрывается в совместном использовании include и exclude. Однако, легко запутаться в порядке их следования.
Рассмотрим следующую ситуацию, нам нужно скопировать все файлы с именем, начинающимся на picture, но не те, в которых есть двойка:
[root@waky practice]# rsync -va --include='*/' --exclude='*2*' --include='picture*' --exclude='*' ./source/ ./destination/
sending incremental file list
./
dir1/
dir1/picture1.jpg
dir1/picture1.png
dir2/
sent 252 bytes received 69 bytes 642,00 bytes/sec
total size is 0 speedup is 0,00
[root@waky practice]# ls -R destination/
destination/:
dir1 dir2
destination/dir1:
picture1.jpg picture1.png
destination/dir2:
[root@waky practice]#
Объяснение:
–include=’*/’ — включает структуру директорий
–exclude=’*2*’ – исключает файлы с 2 в названии
–include=’picture*’ – включает файлы с picture в названии
–exclude=’*’ — исключает всё остальное
Программа прошлась по всем директориям, исключила файлы содержащие двойку, выделила файлы с picture и убрала все остальные.
Отчистим папку назначения и повторим пример, но только поменяем местами два условия:
[root@waky practice]# rsync -va --include='*/' --include='picture*' --exclude='*2*' --exclude='*' ./source/ ./destination/
sending incremental file list
./
dir1/
dir1/picture1.jpg
dir1/picture1.png
dir2/
dir2/picture2.jpg
dir2/picture2.png
sent 379 bytes received 107 bytes 972,00 bytes/sec
total size is 0 speedup is 0,00
[root@waky practice]# ls -R destination/
destination/:
dir1 dir2
destination/dir1:
picture1.jpg picture1.png
destination/dir2:
picture2.jpg picture2.png
[root@waky practice]#
Казалось бы, та же команда, но другой результат. rsync прошелся по всем директориям, выделила файлы с picture, не исключил файлы picture2.jpg и picture2.png из списка, так как они ранее уже были добавлены благодаря включению, в конце исключил все остальные файлы.
Один и тот же файл может быть обработан только одним условием, тем, которое идет раньше. Важно помнить об этом правиле, составляя сложные условия.
Советы по использованию include/exclude
- Можно комбинировать несколько правил для точного выбора.
- Для сложных сценариев важен порядок следования условий.
- Используйте шаблоны (*), чтобы задавать группы файлов по маске.
- Не забывайте о слэше в конце путей для обозначения папок.
Заключение
Команда rsync с опциями include и exclude — это очень гибкий инструмент для точного выбора файлов при копировании или синхронизации данных.
Правильное использование этих условий поможет вам быстро выбрать нужные объекты без лишней передачи данных.