複数の壊れたシンボリックリンクを「再接続」する方法は?

複数の壊れたシンボリックリンクを「再接続」する方法は?

ファイルを指す複数のシンボリックリンクを持つディレクトリツリーがあります。しかし、すべてのシンボリックリンクに/home移動し、すべてのシンボリックリンクを「再接続」する方法が必要です。そのような機能が存在しますか、それを行うにはスクリプトを作成する必要がありますか?/home/mnt/home

たとえば、次のようなものがあります。

[root@trees ~]# ls -l /mnt/home/someone/something
total 4264
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 a -> /home/someone/someotherthing/a
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 b -> /home/someone/someotherthing/b
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 c -> /home/someone/someotherthing/c
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 d -> /home/someone/someotherthing/d
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 e -> /home/someone/someotherthing/e

/mnt/home/someone/something/subdir:
total 4264
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 a -> /home/someone/someotherthing/subdir/a
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 b -> /home/someone/someotherthing/subdir/b
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 c -> /home/someone/someotherthing/subdir/c
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 d -> /home/someone/someotherthing/subdir/d
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 e -> /home/someone/someotherthing/subdir/e

すべてのシンボリックリンクを見つけて同じ場所に再接続するコマンドが必要ですが、代わりに下にあります/mnt/home/home

そのようなコマンドは存在しますか?

ベストアンサー1

シンボリックリンクをリダイレクトするコマンドはなく、シンボリックリンクを削除して別のリンクを作成するだけです。 GNUユーティリティがあると仮定すると(組み込みのLinuxやCygwinでは)、mainを使用してターゲットごとにシンボリックリンクを一致させ、リンクの-lname内容を読み取ることができます。テストされていません:findreadlink

find /mnt/home/someone/something -lname '/home/someone/*' \
     -exec sh -c 'ln -snf "/mnt$(readlink "$1")" "$1"' sh {} \;

これらのシンボリックリンクを比較的作成するのが最善です。lnGNU coreutils 8.22 から来ると仮定し、-rそのオプションをln別のオプションに渡すと、ターゲットは相対パスに変換されます。古いシステムの場合、または有効なリンクを一括で再構築する場合は、次の便利なユーティリティがあります。symlinks(もともとMark Lordによって管理され、現在はJ. Brandt Buckleyによって管理されています)、多くのLinuxディストリビューションに存在します。

上記のように有効なリンクを移動する前または復元した後、runはsymlinks -c /mnt/home/someone/somethingファイルシステムの境界を超えない限り、指定されたディレクトリの下のすべての絶対記号リンクを相対記号リンクに変換します。

おすすめ記事