Ho un sottofilesystem completo all'interno di un percorso /home/user/system
contenente la struttura standard di Linux con le directory /bin
, /home
, /root
, /usr
, /var
, /etc
,...
Questo sottofilesystem contiene collegamenti simbolici, relativi o assoluti. I relativi collegamenti simbolici vanno bene, rimangono all'interno del sottofilesystem sotto /home/user/system
. Ma i collegamenti simbolici assoluti sono problematici, poiché puntano a un obiettivo al di fuori del sottofilesystem.
Ad esempio, assumiamo un collegamento simbolico assoluto come segue (visto all'interno del sottofilesystem):
/usr/file1 -> /usr/lib/file1
Nel filesystem generale abbiamo un collegamento a /home/user/system/usr/file1
che ora puntano a un file /usr/lib/file1
al di fuori del sottofilesystem, invece di un file /home/user/system/usr/lib/file1
dentro il sottofilesystem.
Vorrei avere uno script semplice, preferibilmente una singola riga di comando (rsync, chroot, find, ...) che converta ogni collegamento simbolico assoluto in uno relativo.
Nell'esempio fornito, quel collegamento relativo diventerebbe
/usr/file1 -> ../usr/lib/file1
Risposta accettata:
Con i symlinks
utility di Mark Lord (offerto da molte distribuzioni; se il tuo non ce l'ha, compilalo dal sorgente):
chroot /home/user/system symlinks -cr .
In alternativa, su sistemi che hanno un readlink
comando e un -lname
predicato da find
(attenzione:codice non testato):
cd /home/user/system &&
find . -lname '/*' -exec ksh -c '
for link; do
target=$(readlink "$link")
link=${link#./}
root=${link//+([!/])/..}; root=${root#/}; root=${root%..}
rm "$link"
ln -s "$root${target#/}" "$link"
done
' _ {} +