GNU/Linux >> Tutoriels Linux >  >> Linux

Mettre à jour les liens symboliques par lots de manière récursive

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 :

  1. Le répertoire dans lequel vous souhaitez effectuer le renommage par lots des liens symboliques
  2. L'ancien modèle. Ici link1 est l'ancien modèle qui sera remplacé
  3. Le nouveau motif. Ici link2 est le nouveau motif avec lequel link1 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"


Linux
  1. Trouver les fichiers les plus volumineux de manière récursive ?

  2. Mise à jour automatique?

  3. Existe-t-il un moyen de vérifier s'il existe des liens symboliques pointant vers un répertoire ?

  4. Variables d'environnement dans les liens symboliques

  5. Comportement de cd/bash sur les liens symboliques

Comment supprimer (supprimer) des liens symboliques sous Linux

Guide pour ajouter des liens symboliques Linux

Un moyen simple de lister les liens symboliques sous Linux

Comment trouver des liens symboliques brisés sous Linux

Comment obtenir une liste de liens symboliques sous Linux

rsync et liens symboliques