HP UNIX のシンボリック リンクの変更

HP UNIX のシンボリック リンクの変更

いくつかのシンボリック リンクの名前を変更するために、次の変更を行おうとしています。

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

関連情報