たとえば、次のようにツリー内の多くのファイルの名前を変更します。
[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
技術的な説明とは別に回答になりました。シンボリックリンクが指す位置を変更できます。
- それらを探す
find . -type l
- 目標を変える
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の答えに基づいています。