単純なLinuxコマンドを使用して絶対シンボリックリンクを相対シンボリックリンクに変換する

単純なLinuxコマンドを使用して絶対シンボリックリンクを相対シンボリックリンクに変換する

/home/user/system/bin、、、、、、/home...ディレクトリを含む標準のLinux/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

ベストアンサー1

とともに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
' _ {} +

おすすめ記事