
Ich versuche, Folgendes zu ändern, um einige symbolische Links umzubenennen:
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
Leider -lname
funktioniert die Option nicht für HPUX. Kennt ihr etwas gleichwertiges, das ich verwenden kann?
Um Ihnen eine Vorstellung von meinem Problem zu geben: Ich möchte alle symbolischen Links in einem bestimmten Ordner ändern.
New Symbolic link --> /base/testusr/scripts
Old Symbolic link --> /base/produsr/scripts
Jetzt enthält Ordner „A“ mehr als 100 verschiedene Dateien mit Softlinks, die ich auf diese Weise ändern muss.
Antwort1
Mit ausschließlich POSIX-Tools kann das Ziel eines symbolischen Links nur über angezeigt werden ls
. Der Linux- und BSD- readlink
Befehl ist leider kein Standard.
Die Verwendung von ls
ist problematisch, da Sie die Dateinamen analysieren müssen. Vorausgesetzt, Ihre Dateinamen enthalten keine Zeilenumbrüche und die Ziele der symbolischen Links enthalten nicht die Teilzeichenfolge ->
, gibt der Befehl ls -l "$link" | sed 's/.* -> //'
das Ziel des Links aus.
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