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

rsync для адаптации ссылок с абсолютными путями к месту назначения

Можно ли с помощью rsync адаптировать абсолютные символические ссылки к новому местоположению в пункте назначения?

Прецедент
Представьте, что у меня есть ссылка на такой файл:

/ usera / файлы / общий / тестовый_файл
/ usera / files / common / links / test_link -> / usera / files / common / test_file

Теперь я хотел бы выполнить синхронизацию всего каталога common в другое место. (разрешения группы адаптированы, смотрите ниже почему)

rsync -av --no-g / usera / files / common / / userb / common

Это дает мне:

/ userb / common / test_file
/ userb / common / links / test_link -> / usera / files / common / test_file

Эта проблема
Проблема в том, что группа в пункте назначения отличается от группы в источнике (из соображений безопасности), поэтому test_link не указывает на /userb/ пространство, а скорее /usera/ и поэтому не может быть прочитан этим пользователем.

Вопрос
Можно ли указать rsync адаптировать ссылки под точкой синхронизации (/common/ здесь), чтобы соответствовать новому месту назначения? Это дало бы ссылку как таковую:

/ userb / common / links / test_link -> / userb / common / test_file

Я пробовал следовать решению аналогичная проблема, однако, похоже, он не делает то, что я хочу ..

Спасибо!

Rsync этого не поддерживает. Его можно изменить для этого, но rsync уже имеет слишком много параметров. Вы можете достичь своей цели, выполнив это после rsync:

find /tmp/userb -type l -ls |
awk '$13 ~ /^\/tmp\/usera/ { sub("/tmp/usera/files/", "/tmp/userb/", $13); print $11, $13 }' |
while read A B; do rm $A; ln -s $B $A; done

Также разрешены пробелы в любом имени файла (таким образом, используя "?" В качестве разделителя, который, по крайней мере, является запрещенным символом в файловых системах NTFS):

find /tmp/userb -type l -printf "%p?%l\n" |
awk -vFS="?" '$2 ~ /^\/tmp\/usera/ { sub("/tmp/usera/files/", "/tmp/userb/", $2); print $1 "?" $2 }' |
while IFS=? read A B; do rm "$A"; ln -s "$B" "$A"; done