Назад | Перейти на главную страницу

Как rsync символические ссылки и их референты, но с сохранением ссылок

В моем каталоге src есть следующая файловая структура:

en/
en/a/
en/a/file1 -> ../../en/mp3/file1-longer-name-a
en/a/file2 -> ../../en/mp3/file2-longer-name-a
en/mp3/file1-longer-name-a
en/mp3/file1-longer-name-b
en/mp3/file2-longer-name-a
en/mp3/file3-longer-name-a

Мне интересно скопировать все файлы в en / a / в место назначения, сохранив символические ссылки, а также включить файлы-референты (которые, кстати, все в en /), но не другие файлы в en / mp3 /, если они не указаны любые символические ссылки, которые я передаю.

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

rsync -avRz "${SRC}./en/a" "${DST}"

это передает следующие файлы:

en/
en/a/
en/a/file1 -> ../../en/mp3/file1-longer-name-a
en/a/file2 -> ../../en/mp3/file2-longer-name-a

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

en/mp3/file1-longer-name-a
en/mp3/file2-longer-name-a

есть ли способ добиться этого без необходимости писать алгоритм для перебора программных ссылок в en / a / и передачи файлов, на которые они указывают, один за другим?

Вы могли бы использовать find в сочетании с rsync --files-from параметр:

find "${SRC}./en/a" -type l -exec readlink {} ';'|sort|uniq|rsync -avRz --files-from=- "${SRC}" "${DST}"
  • find перечисляет все символические ссылки в папке en / и выполняет readlink для каждой из них.
  • затем мы сортируем список и отфильтровываем дубликаты (с sort и uniq)
  • и rsync получает --files-from параметр установлен на - чтобы прочитать файлы, которые он должен синхронизировать со стандартным вводом