Не удается получить опцию rsync exclude для исключения директории - PullRequest
10 голосов
/ 17 марта 2011

Возникли проблемы с rsync. Я использую rsync в качестве прославленной команды cp. У меня в скрипте следующий код.

rsync -aL --exclude /path/to/exclude/ --exclude='.*' /source/ /destination

Я могу заставить rsync исключить любые скрытые файлы. Следовательно, '.*' я не могу заставить исключить dir для исключения. Я пытался использовать знак '=', окружая каталог двойными кавычками, одинарными кавычками. Любая помощь будет принята с благодарностью. Заранее спасибо.

Ответы [ 4 ]

15 голосов
/ 15 августа 2013

На самом деле, ни один из них не является полностью точным.

Эрик наполовину прав, говоря, что

Поскольку test / a является базовым каталогом, из которого выполняется синхронизация, шаблон исключения указывается, начиная с /

Это правда, что корень шаблона исключения равен test/a (то есть шаблон /some/path связывается с test/a/some/path), но это еще не все.

со страницы руководства:

если шаблон начинается с /, то он привязывается к определенной точке в иерархии файлов, в противном случае он сопоставляется с концом пути. Это похоже на ведущий ^ в регулярных выражениях. Таким образом, "/ foo" будет соответствовать файлу с именем "foo" в любом из «корень передачи» (для глобального правила) или в каталоге файла слияния (для правила для каждого каталога).

Мы можем игнорировать бит per-directory, так как он здесь к нам не относится.

Следовательно, rsync -nvraL test/a test/dest --exclude=a/b/c/d определенно исключит test/a/b/c/d (и детей), но также исключит test/a/other/place/a/b/c/d.

rsync -nvraL test/a test/dest --exclude=/b/c/d, с другой стороны, исключит только test/a/b/c/d (и дочерние элементы) (test/a является точкой, к которой привязывается /).

Вот почему вам все еще нужна начальная косая черта привязки, если вы хотите исключить этот конкретный путь из резервной копии. Это может показаться незначительной деталью, и тем более конкретным будет ваш шаблон исключения (например, Pictures против home/daniel/Pictures), но он может просто укусить вас в задницу.

9 голосов
/ 17 марта 2011
mkdir -p test/a/b/c/d/e
mkdir -p test/dest
rsync -nvraL test/a test/dest --exclude=a/b/c/d 

Это работает. Поскольку test/a является базовым каталогом, из которого выполняется синхронизация, шаблон исключения указывается, начиная с a/

Покажите нам реальные пути / исключите, если это не поможет.

При запуске rsync с параметром -vn будет выведен список папок / файлов - шаблон сопоставляется с форматом, который печатает rsync.

3 голосов
/ 14 февраля 2012

Следуя примеру Эрика, вы хотите сделать это:

rsync -nvraL test/a/ test/dest --exclude=/b/c/d
0 голосов
/ 16 августа 2018

Если вы хотите указать абсолютные пути, вы можете преобразовать их в относительные пути, используя realpath :

--exclude="$(realpath --relative-to=$PWD /home/file)"
...