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 cuilink1
verrà 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"