
Я пытаюсь изменить следующее, чтобы переименовать некоторые символические ссылки:
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