Rsync: возможно ли передавать файлы src в виде символических ссылок и копировать остальную часть структуры dir

Я хочу скопировать директорию src в качестве шаблона, т. Е. Сохранить ту же структуру. Файлы в этом каталоге dir должны указывать на каталог src как символические ссылки. Я не уверен, что rsync может сделать это из коробки.

Rsync может выполнять только копии или (иногда) жесткие ссылки, а не символические ссылки. Программа cp от GNU coreutils может делать то, что вы хотите, по крайней мере, если вам не нужны модные параметры rsync, такие как фильтрация на основе имен файлов. Просто используйте флаг -s , плюс -a для рекурсии.

 cp -as source target 

Если вам нужна фильтрация, вы можете использовать zmv zsh . Функция zmv перемещает файлы по умолчанию, но вы можете указать другую операцию с -S (создать символические ссылки, но это не подходит для вашего использования, потому что оно не копирует каталоги) или -p (укажите произвольную программу, здесь я используйте функцию, которая создает все необходимые каталоги, а затем создает символическую ссылку). Вы можете указать шаблон, чтобы ограничить копирование файлов; здесь я использую ^*.dontcopy чтобы опустить файлы с расширением .dontcopy и (m-7) только для обработки файлов, измененных за последние 7 дней, плюс ^/ чтобы исключить каталоги из списка файлов для обработки.

 mkdir_ln () { mkdir -p $2:t && ln -s $1:A $2 } cd source zmv -p mkdir_ln -Q '**/^*.dontcopy(m-7^/)' '../target/$f' 

Выше я использую модификатор истории (:A) чтобы превратить первый аргумент в абсолютный путь. Если вы хотите создать относительные символические ссылки, вам нужно будет создать правильный целевой путь с правильным количеством компонентов ../ .

 mkdir_ln () { mkdir -p $2:t && ln -s ${1//[^/]##/..}/$1 $2 } 

Насколько я могу судить, флаг -a будет делать, как вы просите; копировать рекурсивно при сохранении символических ссылок. Например:

 $ mkdir -vp foo/{bar,baz}; touch foo/file; ln -vs target foo/symlink mkdir: created directory `foo' mkdir: created directory `foo/bar' mkdir: created directory `foo/baz' `foo/symlink' -> `target' $ tree -l foo foo ├── bar ├── baz ├── file └── symlink -> target 2 directories, 2 files $ rsync -a foo/ foo1/ $ tree -l foo1 foo1 ├── bar ├── baz ├── file └── symlink -> target 2 directories, 2 files