Mám kompletní podsouborový systém uvnitř cesty /home/user/system
obsahující standardní strukturu Linuxu s adresáři /bin
, /home
, /root
, /usr
, /var
, /etc
,…
Tento dílčí souborový systém obsahuje symbolické odkazy, buď relativní nebo absolutní. Relativní symbolické odkazy jsou v pořádku, zůstávají v podsystému souborů pod /home/user/system
. Absolutní symbolické odkazy jsou však problematické, protože ukazují na cíl mimo dílčí systém souborů.
Jako příklad předpokládáme následující absolutní symbolický odkaz (viditelný uvnitř dílčího systému souborů):
/usr/file1 -> /usr/lib/file1
V celkovém souborovém systému máme odkaz na /home/user/system/usr/file1
které nyní ukazují na soubor /usr/lib/file1
mimo podsystém souborů, místo souboru /home/user/system/usr/lib/file1
uvnitř dílčího systému souborů.
Chtěl bych mít jednoduchý skript, nejlépe jeden příkazový řádek (rsync, chroot, find, …), který převede každý absolutní symbolický odkaz na relativní.
V daném příkladu by se tento relativní odkaz stal
/usr/file1 -> ../usr/lib/file1
Přijatá odpověď:
Pomocí symlinks
utilita od Marka Lorda (nabízená mnoha distribucemi; pokud ji vaše nemá, sestavte ji ze zdroje):
chroot /home/user/system symlinks -cr .
Případně na systémech, které mají readlink
příkaz a -lname
predikát find
(varování:netestovaný kód):
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
' _ {} +