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:
- El directorio en el que desea realizar el cambio de nombre por lotes de enlaces simbólicos
- El viejo patrón. Aquí
link1
es el patrón anterior que será reemplazado - El nuevo patrón. Aquí
link2
es el nuevo patrón con el quelink1
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"