Questo comando bash dovrebbe farlo per te:
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
Utilizza find per identificare tutti i file in qa directory che sono collegamenti simbolici con un obiettivo che si trova nel dev directory, e per ognuna stampa un comando bash che sostituirà il collegamento con un collegamento al percorso equivalente in qa/ . Dopo averlo eseguito, basta eseguire lo script generato con
bash script.sh
Potresti volerlo prima esaminare manualmente per assicurarti che funzioni.
Ecco una versione più prolissa del precedente find comando per una lettura più semplice (anche se in pratica non lo scriverei necessariamente in questo modo):
SRC_DIR="/home/user/public_html/qa"
OLD_TARGET="/home/user/public_html/dev"
SUB="s/dev/qa/"
find $SRC_DIR -type l \
-lname "$OLD_TARGET/*" -printf \
'ln -nsf "$(readlink "%p"|sed $SUB)" "$(echo "%p"|sed $SUB)"\n'\
> script.sh
Nel caso in cui qualcun altro lo trovi durante la ricerca di una soluzione:crea un file denominato "linkmod.sh" contenente:
#!/bin/sh
PATTERN1=`echo "$2"`
PATTERN2=`echo "$3"`
LINKNAME=`echo "$1"`
OLDTARGET=`readlink "$1"`
NEWTARGET=`echo "$OLDTARGET" \
| sed -e 's/'"$PATTERN1"'/'"$PATTERN2"'/'`
echo ln -nsf "$NEWTARGET" "$LINKNAME"
ed esegui
find . -type l -print0 | xargs -0IX echo linkmod.sh X "pattern1" "pattern2"
Puoi spesso usare l'opzione -lname in find se necessario.
NOTA:devi usare 2x \ nei pattern prima di qualsiasi carattere che richieda \ in sed, poiché echo ne rimuove uno. Ad esempio
find . -type l -print0 | xargs -0IX echo linkmod.sh X "folder\\ name\\/file" "folder2\\ name\\/file"
Rimuovi il echo dall'ultima riga se i comandi ln sono corretti.
Ho creato uno script bash link_rename.sh per la ridenominazione ricorsiva dei link simbolici in una data directory
#! /bin/bash
DIR=$1
OLD_PATTERN=$2
NEW_PATTERN=$3
while read -r line
do
echo $line
CUR_LINK_PATH="$(readlink "$line")"
NEW_LINK_PATH="$CUR_LINK_PATH"
NEW_LINK_PATH="${NEW_LINK_PATH/"$OLD_PATTERN"/"$NEW_PATTERN"}"
rm "$line"
ln -s "$NEW_LINK_PATH" "$line"
done <<< $(find "$DIR" -type l)
Può essere eseguito come link_rename.sh /home/human/dir link1 link2
Lo script ha 3 argomenti:
- La directory in cui desideri eseguire la ridenominazione in batch dei collegamenti simbolici
- Il vecchio schema. Qui
link1è il vecchio modello che verrà sostituito - Il nuovo schema. Qui
link2è il nuovo modello con cuilink1verrà sostituito
Lo script legge in modo ricorsivo tutti i collegamenti simbolici nella directory utilizzando find "$DIR" -type l e lo elabora riga per riga.
$line è il collegamento simbolico che deve essere rinominato
CUR_LINK_PATH è il vecchio percorso
NEW_LINK_PATH si ottiene eseguendo la sostituzione della stringa nel vecchio percorso di collegamento.
Il vecchio collegamento simbolico viene rimosso e il nuovo collegamento simbolico viene creato utilizzando ln -s "$NEW_LINK_PATH" "$line"