パス/home/user/system
内に完全なサブファイルシステムがあります ディレクトリ/bin
を持つ標準のLinux構造を含む 、/home
、/root
、/usr
、/var
、/etc
、…
このサブファイルシステムには、相対リンクまたは絶対リンクのいずれかのシンボリックリンクが含まれています。相対的なシンボリックリンクは問題なく、/home/user/system
の下のサブファイルシステム内にとどまります。 。ただし、絶対シンボリックリンクはサブファイルシステムの外部のターゲットを指しているため、問題があります。
例として、次のような絶対シンボリックリンクを想定しています(サブファイルシステム内に表示されます):
/usr/file1 -> /usr/lib/file1
ファイルシステム全体では、/home/user/system/usr/file1
にリンクがあります。 これで、ファイル/usr/lib/file1
を指すようになります。 ファイル/home/user/system/usr/lib/file1
の代わりに、サブファイルシステムの外部 内部 サブファイルシステム。
簡単なスクリプト、できればすべての絶対シンボリックリンクを相対シンボリックリンクに変換する単一のコマンドライン(rsync、chroot、findなど)が必要です。
与えられた例では、その相対リンクは次のようになります
/usr/file1 -> ../usr/lib/file1
承認された回答:
symlinks
を使用 Mark Lordによるユーティリティ(多くのディストリビューションで提供されています。お持ちでない場合は、ソースからビルドしてください):
chroot /home/user/system symlinks -cr .
または、readlink
があるシステムの場合 コマンドと-lname
find
の述語 (警告:テストされていないコード):
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
' _ {} +