2

Я пытаюсь изменить следующее, чтобы переименовать некоторые символические ссылки:

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 ответ1

1

Только с инструментами POSIX единственный способ увидеть цель символической ссылки - через ls . Команда readlink Linux и BSD, к сожалению, не является стандартной.

Использование 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .