ファイルの名前を変更すると機能しますが、ソフトリンクは古い名前を指します。この問題をどのように解決できますか?

ファイルの名前を変更すると機能しますが、ソフトリンクは古い名前を指します。この問題をどのように解決できますか?

たとえば、次のようにツリー内の多くのファイルの名前を変更します。

[bash]$ for file in `find . -name "*gsf*"`; do `mv $file ${file/gsf/msf}`; done

ファイル名一致では、「gsf」のすべてのインスタンス名が変更されます。GSF「msf」に変更されたがソフトリンクは、「gsf」を含む現在存在しないファイルを指し続けます。

たとえば、名前を変更した後、次のようになります。

lrwxrwxrwx 1 trusktr users     20 Apr 25 14:39 libmsf-1.so -> libgsf-1.so.114.0.23
lrwxrwxrwx 1 trusktr users     20 Apr 25 14:39 libmsf-1.so.114 -> libgsf-1.so.114.0.23
-rwxr-xr-x 1 trusktr users 265584 Apr 21 04:41 libmsf-1.so.114.0.23

ご覧のように、指すソフトリンクはlibgsf-1.so.114.0.23名前がに変わったため、もはや存在しませんlibmsf-1.so.114.0.23

ソフトリンクポインタの名前を変更するにはどうすればよいですか?

答え1

技術的な説明とは別に回答になりました。シンボリックリンクが指す位置を変更できます。

  1. それらを探すfind . -type l
  2. 目標を変えるln -sfT target link_name

-sfTオプションは次のように指定する必要があります。リダイレクトシンボリックリンクは驚くべきことではありません。

答え2

何もありません。それがシンボリックリンクを作成する理由です。直接処理する必要があります。ハードリンクはファイルシステムの実際のインデックスノード(「inode」)を参照するため、有効なままです。これがまさにこの場合、シンボリックリンクの代わりにハードリンクを使用したい理由です。

答え3

@C2H5OHと@user1277476の答えに基づいて解決策を見つけました。

$ for file in `find . -type l`; do link=$(readlink $file); ln -sfT ${link//gsf/msf} $file; done

答え4

注釈を追加できないため、ここのバージョンはリンクを見つけるためにシェルを呼び出さないため、fork()やその他のシステム呼び出しによる追加のオーバーヘッドは防ぎます。

for file in $(find . -type l); do 
    link=$(readlink $file); 
    ln -sfT ${link//gsf/msf} $file; 
done

これは@trusktrの答えに基づいています。

関連情報