У меня есть структура папок, которую я хочу скопировать с помощью rsync. Структура представляет собой ряд резервных копий, из которых я хочу скопировать только последнюю (которую можно идентифицировать с помощью символической ссылки), например так:
/backups
/foo
/2019-05-01
/2019-06-01
/latest -> 2019-06-01
/bar
/2019-05-20
/2019-06-20
/latest -> 2019-06-20
И так далее; я хотел бы, используя одну команду rsync, скопироватьтолькорезервную latest
копию из каждой папки, в то же время имитируя структуру. Для этого я придумал следующую команду:
rsync -rptgoDLm --include '*/' --include '/*/latest/**' --exclude '*' user@remote:/backups /some/local/path
По сути, это архив с --copy-links
некоторыми трюками include/exclude, чтобы выбрать только /*/*/latest
ветви (плюс -m
, чтобы избежать кучи пустых структур каталогов). Это работает отлично, за исключением одной проблемы: если какая-либо из этих ветвей содержит символические ссылки, то они также копируются как их цели, а не просто как простые символические ссылки.
Что мне действительно нужно уметь делать, так этотолькоиспользовать --copy-links
поведение с latest
символическими ссылками, используя другое поведение (например, поведение --links
) для любых других, которые встречаются.
Возможно ли это с помощью одной команды rsync? Моя цель — иметь возможность запустить это, не зная непосредственного содержимого /backups
, так что если я добавлю что-то новое (например, /backups/baz
), то оно будет автоматически скопировано.
Обновлять: Для ясности, результирующая структура каталогов, которую я хотел бы видеть в месте назначения, будет следующей:
/backups
/foo
/latest
/bar
/latest
т. е. мне нужна только последняя версия каждой резервной копии на целевом устройстве (целевое устройство само будет обрабатывать историю резервных копий другим способом).
решение1
Кажется, это соответствует вашим требованиям.
rsync -avR user@remote:'/backups/*/latest/' /some/local/path/
Флаг -R
фактически «копирует» весь исходный путь в место назначения, и полученные резервные копии будут сохраняться в виде /some/local/path/backups/{whatever}/latest
.
Если вы обнаружили, что вам не нужен весь исходный путь, вы можете включить его, /./
чтобы указать точку, из которой путь должен быть скопирован в место назначения. Например, /backups/./foo/latest/
это приведет к /some/local/path/foo/latest/
(т. е. /backups
компонент был пропущен). В документации ( ) есть много подробностей man rsync
.