Saya memiliki sub-sistem file lengkap di dalam jalur /home/user/system
berisi struktur Linux standar dengan direktori /bin
, /home
, /root
, /usr
, /var
, /etc
,…
Sub-sistem file ini berisi tautan simbolik, baik relatif maupun absolut. Symlink relatif baik-baik saja, mereka tetap berada di dalam sub-sistem file di bawah /home/user/system
. Tetapi symlink absolut bermasalah, karena mengarah ke target di luar sub-sistem file.
Sebagai contoh, kami mengasumsikan symlink absolut sebagai berikut (terlihat di dalam sub-sistem file):
/usr/file1 -> /usr/lib/file1
Dalam keseluruhan sistem file kami memiliki tautan di /home/user/system/usr/file1
yang sekarang menunjuk ke file /usr/lib/file1
di luar sub-sistem file, alih-alih file /home/user/system/usr/lib/file1
di dalam sub-sistem file.
Saya ingin memiliki skrip sederhana, lebih disukai satu baris perintah (rsync, chroot, find, ...) yang mengubah setiap symlink absolut menjadi symlink relatif.
Dalam contoh yang diberikan, tautan relatif itu akan menjadi
/usr/file1 -> ../usr/lib/file1
Jawaban yang Diterima:
Dengan symlinks
utilitas oleh Mark Lord (ditawarkan oleh banyak distribusi; jika milik Anda tidak memilikinya, buatlah dari sumber):
chroot /home/user/system symlinks -cr .
Atau, pada sistem yang memiliki readlink
perintah dan -lname
predikat find
(peringatan:kode belum diuji):
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
' _ {} +