ファイルを指す複数のシンボリックリンクを持つディレクトリツリーがあります。しかし、すべてのシンボリックリンクに/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
内容を読み取ることができます。テストされていません:find
readlink
find /mnt/home/someone/something -lname '/home/someone/*' \
-exec sh -c 'ln -snf "/mnt$(readlink "$1")" "$1"' sh {} \;
これらのシンボリックリンクを比較的作成するのが最善です。ln
GNU coreutils 8.22 から来ると仮定し、-r
そのオプションをln
別のオプションに渡すと、ターゲットは相対パスに変換されます。古いシステムの場合、または有効なリンクを一括で再構築する場合は、次の便利なユーティリティがあります。symlinks
(もともとMark Lordによって管理され、現在はJ. Brandt Buckleyによって管理されています)、多くのLinuxディストリビューションに存在します。
上記のように有効なリンクを移動する前または復元した後、runはsymlinks -c /mnt/home/someone/something
ファイルシステムの境界を超えない限り、指定されたディレクトリの下のすべての絶対記号リンクを相対記号リンクに変換します。