GNU/Linux >> Tutoriales Linux >  >> Linux

Actualización por lotes de enlaces simbólicos recursivamente

Este comando bash debería hacerlo por ti:

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

Utiliza find para identificar todos los archivos en el qa directorio que son enlaces simbólicos con un destino que está en el dev directorio, y para cada uno, imprime un comando bash que reemplazará el enlace con un enlace a la ruta equivalente en qa/ . Después de ejecutar esto, simplemente ejecute el script generado con

bash script.sh

Es posible que desee examinarlo manualmente primero para asegurarse de que funcionó.

Aquí hay una versión más detallada del find anterior. Comando para una lectura más fácil (aunque no necesariamente lo escribiría de esta manera en la práctica):

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

En caso de que alguien más encuentre esto al buscar una solución:Cree un archivo llamado "linkmod.sh" que contenga:

#!/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"

y corre

find . -type l -print0 | xargs -0IX echo linkmod.sh X "pattern1" "pattern2"

Puede usar la opción -lname en find si es necesario.

NOTA:debe usar 2x \ en los patrones antes de cualquier carácter que requiera \ en sed, ya que echo elimina uno. Por ejemplo

find . -type l -print0 | xargs -0IX echo linkmod.sh X "folder\\ name\\/file" "folder2\\ name\\/file"

Eliminar el echo desde la última línea si los comandos ln son correctos.


Creé un script bash link_rename.sh para el cambio de nombre recursivo de enlaces simbólicos en un directorio dado

#! /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)

Se puede ejecutar como link_rename.sh /home/human/dir link1 link2

El script tiene 3 argumentos:

  1. El directorio en el que desea realizar el cambio de nombre por lotes de enlaces simbólicos
  2. El viejo patrón. Aquí link1 es el patrón anterior que será reemplazado
  3. El nuevo patrón. Aquí link2 es el nuevo patrón con el que link1 será reemplazado

El script lee recursivamente todos los enlaces simbólicos en el directorio usando find "$DIR" -type l y lo procesa línea por línea.

$line es el enlace simbólico que necesita ser renombrado

CUR_LINK_PATH es el camino viejo

NEW_LINK_PATH se obtiene al realizar el reemplazo de cadenas en la ruta del enlace anterior.

El antiguo enlace simbólico se elimina y se crea un nuevo enlace simbólico usando ln -s "$NEW_LINK_PATH" "$line"


Linux
  1. ¿Encontrar los archivos más grandes recursivamente?

  2. ¿Actualización automática?

  3. Cambiar recursivamente las extensiones de archivo en Bash

  4. ¿Cómo copiar enlaces simbólicos?

  5. ¿Usar SED recursivamente en Linux?

Cómo quitar (eliminar) enlaces simbólicos en Linux

Guía para agregar enlaces simbólicos de Linux

Una forma sencilla de enumerar enlaces simbólicos en Linux

Cómo encontrar enlaces simbólicos rotos en Linux

Cómo obtener una lista de enlaces simbólicos en Linux

rsync y enlaces simbólicos