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í
link1es el patrón anterior que será reemplazado - El nuevo patrón. Aquí
link2es el nuevo patrón con el quelink1será 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"