我正在尝试修改以下内容以重命名一些符号链接:
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