Rsync игнорирует папки, заканчивающиеся косыми чертами - PullRequest
0 голосов
/ 25 июня 2018

У меня есть следующий контент в файле с именем "/rsync/include.txt"

+ /home/**
+ /opt**
- *

Затем я вызываю команду rsync следующим образом:

rsync -avr --include-from="/rsync/include.txt" . ../backup

Это дает следующий вывод:

sending incremental file list
created directory ../archive
./
opt/
opt/some-file
opt/include-me/
opt/include-me/me-too
opt/include-me/and-me/

sent 299 bytes  received 106 bytes  810.00 bytes/sec
total size is 0  speedup is 0.00

Каталог /home существует и содержит файлы.

Почему шаблон + /home/** не работает? Я не хочу использовать шаблон + /home**, так как он может соответствовать другим именам папок, например, /homeopathy.

Может кто-нибудь помочь мне понять, почему эта команда не работает, и указать мне направление рабочей команды?

РЕДАКТИРОВАТЬ : Хотя я все еще хотел бы получить ответ на этот вопрос, я искренне предлагаю использовать rdiff-backup, поскольку он использует аналогичные файлы и шаблоны фильтрации, но его существенно проще использовать. Сегодня я потратил много времени на эту проблему с rsync, которая была решена за несколько минут с помощью rdiff-backup.

1 Ответ

0 голосов
/ 26 июня 2018

Общая информация об отладке

Самый простой способ узнать, выполняют ли ваши правила фильтрации то, что вы хотите, - это использовать -vv (увеличить детализацию вдвое) в сочетании с -n (пробный прогон).

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

Пример

%  rsync -avv --include 'opt/1' --exclude 'opt/*' -n ./ /tmp  \
    | grep '\[sender\]'
[sender] showing directory opt/1 because of pattern opt/1
[sender] hiding directory opt/2 because of pattern opt/*
[sender] hiding directory opt/3 because of pattern opt/*

Конкретный ответ

Ваш пример не удалсяпоскольку + /home/** исключено - *.

man rsync состояния:

Обратите внимание, что при использовании параметра --recursive (-r)(что подразумевается под -a), каждый компонент subdir каждого пути посещается слева направо, причем каждый каталог имеет шанс на исключение до его содержимого.

Таким образом, шаблон /home/** будетоценивается после прохождения /home, но этого никогда не произойдет, потому что - * исключает /home.

Чтобы включить /home/, вам просто нужно вставить его до /home/**, так что ваш файл исключения становится:

+ /home/
+ /home/**
+ /opt/
+ /opt/**
- *
...