Копировать только определенные символические ссылки с помощью rsync?

Копировать только определенные символические ссылки с помощью rsync?

У меня есть структура папок, которую я хочу скопировать с помощью 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.

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