Можно ли с помощью 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