Cette commande bash devrait le faire pour vous :
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
Il utilise find
pour identifier tous les fichiers dans le qa
répertoire qui sont des liens symboliques avec une cible qui se trouve dans le dev
répertoire, et pour chacun, il imprime une commande bash qui remplacera le lien par un lien vers le chemin équivalent dans qa/
. Après avoir exécuté ceci, exécutez simplement le script généré avec
bash script.sh
Vous voudrez peut-être d'abord l'examiner manuellement pour vous assurer qu'il a fonctionné.
Voici une version plus détaillée du find
ci-dessus commande pour une lecture plus facile (bien que je ne l'écrirais pas nécessairement de cette façon dans la pratique):
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
Au cas où quelqu'un d'autre trouverait cela lors de la recherche d'une solution :créez un fichier nommé "linkmod.sh" contenant :
#!/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"
et lancez
find . -type l -print0 | xargs -0IX echo linkmod.sh X "pattern1" "pattern2"
Vous pouvez ofc utiliser l'option -lname dans find si nécessaire.
REMARQUE :vous devez utiliser 2x \ dans les modèles avant tout caractère nécessitant \ dans sed, car echo en supprime un. Par exemple
find . -type l -print0 | xargs -0IX echo linkmod.sh X "folder\\ name\\/file" "folder2\\ name\\/file"
Supprimer le echo
à partir de la dernière ligne si les commandes ln sont correctes.
J'ai créé un script bash link_rename.sh
pour renommer récursivement les liens symboliques dans un répertoire donné
#! /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)
Il peut être exécuté en tant que link_rename.sh /home/human/dir link1 link2
Le script a 3 arguments :
- Le répertoire dans lequel vous souhaitez effectuer le renommage par lots des liens symboliques
- L'ancien modèle. Ici
link1
est l'ancien modèle qui sera remplacé - Le nouveau motif. Ici
link2
est le nouveau motif avec lequellink1
sera remplacé
Le script lit de manière récursive tous les liens symboliques du répertoire en utilisant find "$DIR" -type l
et le traite ligne par ligne.
$line
est le lien symbolique qui doit être renommé
CUR_LINK_PATH
est l'ancien chemin
NEW_LINK_PATH
est obtenu en effectuant un remplacement de chaîne dans l'ancien chemin du lien.
L'ancien lien symbolique est supprimé et un nouveau lien symbolique est créé en utilisant ln -s "$NEW_LINK_PATH" "$line"