Как исключить папку из rsync

60

Я пытаюсь сделать резервную копию моей домашней папки на диске NAS. Я даю это:

rsync -Paz --exclude-from 'rsync-exclude.txt' /home/chris/ admin@192.168.1.65:LinuxHome

где rsync-exclude.txtэто содержание:

/home/chris/Downloads/*
/home/chris/Downloads/
/home/chris/Downloads/*.*

и это в той же папке я выполняю rsync (домашняя папка).

Однако rsync пытается скопировать и эту папку.

Что я делаю неправильно?

xpanta
источник

Ответы:

88

Вы предоставляете абсолютные пути в своем списке исключений.

С помощью rsync все пути исключения (или включения!), Начинающиеся с /, привязываются к « корню передачи ».

Корень переноса в этом случае есть /home/chris. Если вы сделали:

rsync -Paz --exclude-from 'rsync-exclude.txt' / admin@192.168.1.65:

... тогда ваши исключения должны работать (но вы бы скопировали все остальное в этой файловой системе!).

Но поскольку вы просто пытаетесь синхронизировать свой домашний каталог, а подкаталог /home/chrisnamed не найден "home/chris/Downloads", rsyncничего не находит.

Поэтому попробуйте удалить /home/chrisчасти из вашего rsync-exclude.txtфайла.

На самом деле, вам просто нужна одна строка в файле:

/Downloads

Обратите внимание, что если вы не укажете ведущий /, и у вас будут имена других каталогов "Downloads", они также будут исключены. Я предполагаю, что вы хотите исключить только ваш каталог верхнего уровня (относительно исходного каталога, или корня передачи) Downloads, так что вам нужен ведущий /.

Самый простой способ (исключить только несколько путей)

Если вам нужно исключить только один каталог, просто сделайте это (избегая отдельного файла):

rsync -Paz --exclude /Downloads /home/chris/ admin@192.168.1.65:LinuxHome

Вы также можете связать вместе --excludeтеги, например, так:

rsync -Paz --exclude /Downloads --exclude '/Something Else' --exclude .hiddenFile /home/chris/ admin@192.168.1.65:LinuxHome

Обратите внимание, что, поскольку косой черты нет, она будет исключена .hiddenFileиз любого каталога, который она скопирует!

Но если у вас есть несколько исключений, вам лучше --exclude-fromиметь и файл.

Запись

Я вижу , что вы получили это право, но эти новые для Rsync следует отметить косую черту в конце из/home/chris/

Процитируем rsyncman-страницу: «Вы можете думать о конце / в источнике как о значении« копировать содержимое этого каталога », а не« копировать каталог по имени ».»

Поэтому, если вы остановите этот завершающий слеш, вы получите каталог, называемый chrisв целевом каталоге, содержащий все из /home/chris(кроме Downloads, конечно, исходного каталога!).

Lambart
источник
2

Это может быть проще для глаз, и просто заметка об исключении каталогов и синтаксиса:

SRC='/home/username'
DST='/run/media/username/EasyStoreRT/rsync'

rsync -avrh --stats                                 \
    --log-file=/home/username/log/rsync-home.log    \
    --exclude='/username/.cache'                    \
    --exclude='/username/.local/share/Trash'        \
    $SRC \
    $DST \

Это исключит эти каталоги и все файлы в них. По какой-то причине rysnc не добавлял / home / username в /.cache. Только home / будет привязывать себя, поэтому мне пришлось добавить / username в каждый исключенный каталог.

Страницы руководства говорят: «если шаблон начинается с /, то он привязывается к определенной точке в иерархии файлов, в противном случае он сопоставляется с концом пути». Но эта иерархия, кажется, является только первым каталогом в исходном каталоге. Я использую bash версии 4.4.23 (1) -релиз.

jltrinchard
источник