
我正在嘗試修改以下內容以重命名一些符號連結:
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
很脆弱,因為您必須解析檔案名稱。假設您的檔案名稱不包含換行符號且符號連結的目標不包含 substring ->
,則該命令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