Команда rsync для резервного копирования файлов в основном каталоге и определенных каталогах с удалением

Команда rsync для резервного копирования файлов в основном каталоге и определенных каталогах с удалением

Я пытаюсь подготовить команду rsync, которая будет: 1. делать резервную копию всех файлов в каталоге, кроме вложенных файлов 2. делать резервную копию определенных каталогов 3. удалять файлы в целевом каталоге при их удалении в исходном

rsync -vtr --delete --exclude='*/' --include='includes/*' --include='js/*' --include='css/*' /home/gameboy/abc/* /home/gameboy/PartialMirror/abc/

Но это только копирует файлы и не копирует папки и не удаляет. Не могли бы вы помочь мне улучшить команду?

решение1

Строго говоря, следующие цели можно интерпретировать как противоречивые.

  1. сделать резервную копию всех файлов в каталогено не вложенные файлыт.е. --exclude='*/'
  2. резервное копирование определенных каталогов, т.е. включение некоторых вложенных файлов

Ниже приведено объяснение, почему ваши аргументы не сработали так, как вы предполагали. Ниже вы найдете подходящую альтернативу, которая может подойти для вашей цели (она удовлетворяет пунктам 1, 3 и версии пункта 2).

Почему ваша команда не сработала:

С точки зрения того, как rsync обрабатывает аргументы командной строки, следующие аргументы эквивалентны указанию --exclude='*/'

--исключить='/' --include='желаемая_подпапка/'

т.е. ваша команда исключила все вложенные файлы, тем самым исключив также файлы в желаемых подпапках.

Эта проблема влияет на ваше второе наблюдение, а именно, что файлы в цели, которые удаляются в источнике, не удаляются. На самом деле, ваша команда отлично работает при удалении таких файлов на верхнем уровне. Однако файлы на уровень ниже не удаляются, поскольку они уже исключены. Полезно помнить, что --delete относится к --delete-during, а не --delete-before.

Решения, удовлетворяющие пунктам №1, №3 и версии №2: Следующее решение может подойти вам

rsync -avz --delete --include='includes/*' --include='js/*' --include='css/*' --exclude='*/*' /home/gameboy/abc/ /home/gameboy/PartialMirror/abc/

Он удовлетворяет следующим требованиям: 1. Резервное копирование всех файлов и каталогов на глубине 1, но не вложенных файлов. 2. Резервное копирование нужных папок. 3. Удаляет файлы в месте назначения, которых нет в источнике.

Другой, более громоздкий вариант выглядит следующим образом:

  rsync -vlptgoDd --delete src/ dest/

Это удовлетворяет #1 и #3, но избегает всех вложенных файлов (помните, что папки также являются файлами в *nix). Я избегал указания опции -r, поэтому она не рекурсивна. Delete работает, и папки на глубине 1 копируются. В дополнение к сохранению временных меток (-t) я включил другие типичные опции для копирования архива.

Более стандартный способ получить разное поведение rsync в разных папках — это разбросать правила фильтрации по каталогам по всей иерархии; т. е. создать файлы .rsync-filter, специфичные для каждой папки, требующей уникального поведения. Например

   rsync -avF src/ dest/

Связанный контент