Модификация символической ссылки для 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
Теперь папка "А" содержит более 100 различных файлов, имеющих программные ссылки, которые мне нужно изменить таким образом.
1 ответ
Только с помощью инструментов POSIX единственный способ увидеть цель символической ссылки - это ls
, Linux и BSD readlink
команда к сожалению не стандартная.
С помощью 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