web-dev-qa-db-ja.com

ファイルの名前変更は機能しますが、ソフトリンクは古い名前を指します。どうすれば修正できますか?

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

[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に名前が変更されたため存在しなくなりました。

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

4
trusktr

@ C2H5OHと@ user1277476の回答に基づいて、私は解決策を思いつきました。

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

コメントを追加できないので、リンクを見つけるためにシェルを呼び出さないバージョンがあります。これにより、fork()やその他のシステムコールによる追加のオーバーヘッドが防止されます。

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

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

2
lol

findlnは良いです。
readlinkも良いです。

2
user1277476