Material avançado . Use a seu risco! Você precisará modificá-lo com certeza. Não use se você não entender.
Se você pode viver com links simbólicos absolutos, você pode fazer isso. Suponha que você comece com isso:
[:~/tmp] % ls -l a b c orig
a:
total 0
lrwxrwxrwx 1 rmano rmano 16 Apr 1 16:53 linka -> ../orig/truefile
b:
total 0
lrwxrwxrwx 1 rmano rmano 16 Apr 1 16:53 linkb -> ../orig/truefile
c:
total 0
lrwxrwxrwx 1 rmano rmano 16 Apr 1 16:53 linkc -> ../orig/truefile
orig:
total 0
-rw-rw-r-- 1 rmano rmano 0 Apr 1 16:52 truefile
e você deseja mover os links para ./dest
...
Faça o diretório de destino: mkdir dest
então você pode usar este script (salve-o como script.sh, remova o eco no loop for depois de verificar se está fazendo a coisa correta):
#! /bin/bash
#
# $1 is the "true" file name, $2 the dest directory
# note both must exist, no check done! Let as an exrecise!
#
# put absolute path in $absf
absf="$(readlink -f "$1")"
#
# loop over all of the links we found under ".". Avoid the true file.
# Print instructions; remove the echo if you want to execute them
# (after checking, rm is not reversible)
#
for i in $(find -L . -samefile $1 | grep -v $1); do
echo ln -s $absf "$2"/"$(basename "$i")"
echo rm "$i"
done
... e execute-o como ./script.sh orig/truefile dest/
. Ele irá executar
ln -s /home/rmano/tmp/orig/truefile dest/linkb
rm ./b/linkb
ln -s /home/rmano/tmp/orig/truefile dest/linka
rm ./a/linka
ln -s /home/rmano/tmp/orig/truefile dest/linkc
rm ./c/linkc
e você terá:
[:~/tmp/dest] % cd dest; ls -l
total 0
lrwxrwxrwx 1 rmano rmano 30 Apr 1 17:19 linka -> /home/rmano/tmp/orig/truefile
lrwxrwxrwx 1 rmano rmano 30 Apr 1 17:18 linkb -> /home/rmano/tmp/orig/truefile
lrwxrwxrwx 1 rmano rmano 30 Apr 1 17:19 linkc -> /home/rmano/tmp/orig/truefile
Se você precisar de um symlink relativo, será mais complexo. Você pode verificar este link para começar a codificar ...