Как исключить несколько каталогов с rsync?

184

Я пытаюсь сделать резервную копию моего домашнего каталога с помощью rsync, и я хочу исключить некоторые из каталогов, содержащих нежелательные. Я хочу специально исключить /home/ben/.ccacheи /home/ben/build. К сожалению, документация для rsync была информационной перегрузкой и не ответила на мой вопрос. Вот что я попробовал:

rsync -arv --exclude "/home/ben/.ccache:/home/ben/build" /home/ben /media/ben/thumbdrive/

Как правильно это сделать?

Freedom_Ben
источник
4
Просто хотел сказать, что под флагом уже aподразумевается r:)-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
Populus

Ответы:

238

ОК, я чувствую себя действительно глупо. Еще до того, как я отправил этот вопрос, мой друг показал мне, как это сделать, и это действительно просто. Чтобы исключить несколько каталогов, вы просто используете несколько --exclude=pathпереключателей. Итак, моя команда выше написана правильно:

rsync -arv --exclude=.ccache --exclude=build /home/ben /media/ben/thumbdrive/
Freedom_Ben
источник
7
Абсолютный путь не работал для меня (указанный каталог был молча исключен), тогда как путь относительно исходного каталога работал правильно. Может быть, я что-то упускаю, но я бы с осторожностью отнесся к утверждению @FreeSoftwareServers о том, что абсолютные пути всегда работают.
Сорен Бьорнстад
5
FYI: Опция -aвключает в себя -rтак -arизбыточна.
Дэвид
4
Вопреки мнению FreeSoftwareServers, путь исключения относится к исходному пути, а НЕ /. Так что этот комментарий категорически неверен и приведет к сбоям, если вы последуете ему. Лучшая стратегия состоит в том, чтобы исключить лидирующие / исключающие из списка исключения, чтобы избежать подобных ошибок. Если источник говорит, / home / me и если вы исключаете = '/ mydir /', это исключает каталог mydir в / home / me, то есть исключает / home / me / mydir NOT / mydir / at /. К сожалению, я не могу ни понизить, ни отредактировать этот комментарий, так как он технически неверен и вводит в заблуждение.
Lizardx
3
К вашему сведению, для последующих путешественников, похоже, что комментарий @FreeSoftwareServer был удален. tl; dr: использовать относительные пути
Freedom_Ben
2
Если ты тупой, то и я, и 179 других апвоттеров!
Шридхар Сарнобат
108

Если необходимо исключить несколько каталогов и / или файлов, создайте текстовый файл и используйте --exclude-fromпереключатель. Сделайте файл с именем exclude_me.txtи в нем перечислите ваши исключения. Пример ( /home/ben/exclude_me.txt):

.ccache
build
.java
.gvfs
.xsession-errors

Тогда ваш rsync будет выглядеть примерно так:

rsync -arv --exclude-from='/home/ben/exclude_me.txt' /home/ben /media/ben/thumbdrive/

Это некоторая информация о правилах фильтрации, которая может помочь:

  • /dir/ значит исключить корневую папку /dir
  • /dir/*означает получить корневую папку, /dirно не содержимое
  • dir/ означает исключить любую папку в любом месте, где содержится имя dir/

  • Исключенные примеры: /dir/, /usr/share/directory/, /var/spool/dir/ /var/spool/lpd/cfозначает пропуск файлов, которые начинаются cfв любой папке внутри/var/spool/lpd

Также см. Раздел правил фильтрации на странице руководства.

user228759
источник
4
Важно отметить, что корневая папка означает корень передачи, а не корневой каталог.
Джеймсдлин
Это блестящий ответ!
Александр Жуков
85

Вы также можете исключить несколько путей в фигурных скобках:

rsync -arv --exclude={.ccache,build} /home/ben /media/ben/thumbdrive/
Дьёрдь Рат
источник
40
это работает хорошо, только не под sh, только под bash, я узнал "трудный путь"
xor
7
Нет пробела после запятой. Узнал, что трудный путь тоже styl
styl3r
И не используйте '' вроде --exclude = '. Gvfs'
Мартин Т.
Я думаю, фигурные скобки работают с Ksh. Для других оболочек, вы могли бы использовать что - то вроде: IFS=$'\n'; rsync -arv $(printf '.ccache\nbuild\n' | sed 's/^/--exclude=/g') /home/ben /media/ben/thumbdrive/. Или вы можете просто использовать несколько --excludeаргументов, которые вам придется вводить вручную.
TSJNachos117
1
Причина, по которой это работает, заключается в «Расширении скобок», на случай, если кто-то захочет взглянуть на детали.
Шредалерт