GNU/Linux >> Linux Esercitazione >  >> Linux

Aggiorna in batch collegamenti simbolici in modo ricorsivo

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:

  1. La directory in cui desideri eseguire la ridenominazione in batch dei collegamenti simbolici
  2. Il vecchio schema. Qui link1 è il vecchio modello che verrà sostituito
  3. Il nuovo schema. Qui link2 è il nuovo modello con cui link1 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"


Linux
  1. C'è un modo per verificare se ci sono collegamenti simbolici che puntano a una directory?

  2. Variabili d'ambiente nei collegamenti simbolici

  3. Comportamento di cd/bash sui collegamenti simbolici

  4. Troppi livelli di collegamenti simbolici

  5. usare SED in modo ricorsivo in Linux?

Come rimuovere (eliminare) i collegamenti simbolici in Linux

Guida all'aggiunta di collegamenti simbolici Linux

Un modo semplice per elencare i collegamenti simbolici in Linux

Come trovare collegamenti simbolici interrotti in Linux

Come ottenere un elenco di collegamenti simbolici su Linux

rsync e collegamenti simbolici