
いくつかのシンボリック リンクの名前を変更するために、次の変更を行おうとしています。
find /home/user/public_html/qa/ -type l \
-lname '/home/user/public_html/dev/*' -printf \
'ln -nsf $(readlink %p|sed s/dev/qa/) $(echo %p|sed s/dev/qa/)\n'\
> script.sh
残念ながら、この-lname
オプションは HPUX では機能しません。同等のものをご存知ですか?
私の問題を簡単に説明すると、特定のフォルダー内のすべてのシンボリック リンクを変更したいと考えています。
New Symbolic link --> /base/testusr/scripts
Old Symbolic link --> /base/produsr/scripts
現在、フォルダー「A」には、この方法で変更する必要があるソフト リンクを持つ 100 を超えるさまざまなファイルが含まれています。
答え1
POSIX ツールのみを使用する場合、シンボリック リンクのターゲットを確認する唯一の方法は を使用することですls
。残念ながら、Linux および BSDreadlink
コマンドは標準ではありません。
を使用するls
と、ファイル名を解析する必要があるため、不安定になります。ファイル名に改行が含まれず、シンボリックリンクのターゲットにサブ文字列が含まれていないと仮定すると->
、コマンドはls -l "$link" | sed 's/.* -> //'
リンクのターゲットを出力します。
find /home/user/public_html/qa/ -type l |
while IFS= read -r link; do
target=$(ls -l "$link" | sed 's/.* -> //')
case $target in
/home/user/public_html/dev/*)
link_to_change=$(echo "$link" | sed s/dev/qa/)
ln -nsf "$(echo "$target" | sed s/dev/qa/)" "$link_to_change";;
esac
done