たとえば、ツリー内の多くのファイルの名前を次のように変更しています。
[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
に名前が変更されたため存在しなくなりました。
ソフトリンクポインタにも名前の変更が行われるようにするにはどうすればよいですか?
@ C2H5OHと@ user1277476の回答に基づいて、私は解決策を思いつきました。
$ for file in `find . -type l`; do link=$(readlink $file); ln -sfT ${link//gsf/msf} $file; done
コメントを追加できないので、リンクを見つけるためにシェルを呼び出さないバージョンがあります。これにより、fork()やその他のシステムコールによる追加のオーバーヘッドが防止されます。
for file in $(find . -type l); do
link=$(readlink $file);
ln -sfT ${link//gsf/msf} $file;
done
これは@trusktrの回答に基づいています
find
とln
は良いです。readlink
も良いです。