GNU/Linux >> Linux の 問題 >  >> Linux

単純なLinuxコマンドで絶対シンボリックリンクを相対シンボリックリンクに変換しますか?

パス/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
' _ {} +

Linux
  1. Linuxでホームディレクトリのユーザーアカウントを削除する方法

  2. Linuxシャットダウンコマンド(例付き)

  3. Linuxは複数の連続したパスセパレーター(/ home //// username /// file)をどのように処理しますか?

  1. systemd-homedを使用してLinuxユーザーのホームディレクトリを管理する

  2. Linuxでのシステムユーザーの表示

  3. Chrooted SFTP ユーザーの書き込み権限

  1. 10 の例を含む最も単純な Linux コマンド

  2. デフォルトの /tmp を /home/user/tmp に変更する方法

  3. Linux システム ユーザーとしてコマンドを実行します (シェル =/bin/false)