Как правильно использовать команду rsync с опциями include и exclude: подробное руководство с примерами.

Если вы занимаетесь администрированием Linux серверов, в частности серверов, на которых размещаются сайты, вам часто приходится работать с большим количеством файлов.

В этом случае очень помогает команда rsync — мощный инструмент для быстрого и эффективного переноса данных. В прошлой статье мы рассмотрели базовые случаи использование данной утилиты.

Сегодня я расскажу, как правильно использовать rsync с опциями include и exclude, чтобы выбрать только нужные файлы и папки, а также приведу много примеров с подробными пояснениями.

Общая информация

rsync — это программа для копирования и синхронизации файлов между серверами или внутри одной машины.

Она умеет переносить только изменённые части файлов, что значительно ускоряет процесс и экономит трафик. Благодаря гибким настройкам, rsync позволяет точно управлять тем, что копировать, а что — пропускать.

Зачем нужны include и exclude?

Иногда нужно скопировать не все файлы из папки, а только определённые типы или исключить ненужные. Например:

  • Копировать только картинки формата jpg и png
  • Исключить временные файлы *.tmp
  • Скопировать только папки с определёнными названиями

Для этого используют опции –include (включить) и –exclude (исключить). Они позволяют задать правила выбора файлов.

Как работают include и exclude?

Опция –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 — это очень гибкий инструмент для точного выбора файлов при копировании или синхронизации данных.

Правильное использование этих условий поможет вам быстро выбрать нужные объекты без лишней передачи данных.