4 votos

¿Cómo recursiva Editar ruta de enlaces simbólicos?

Esta es una pregunta adicional que comenzó con esto - Cómo editar Enlaces Simbólicos en OS X?

Ahora que sé cómo editar la ruta de enlaces punto a, estoy tratando de averiguar cómo hacer esto de forma recursiva para cualquier enlace simbólico roto. Soy un PHP chico, por lo que esta CLI cosas es algo extraño para mí...

Parece ser que existen algunos elementos específicos al este, a saber:

  1. Identificar un enlace simbólico roto y recuperar su ubicación
  2. Los antiguos, ahora incorrecta, el destino para el enlace simbólico
  3. La construcción de la nueva ruta de acceso correcta para el enlace simbólico a punto para
  4. Editar el enlace simbólico

El primero es bastante fácil:

find /path/to/search -type l | while read f; do if [ ! -e "$f" ]; then ls -l "$f"; fi; done

Esto me pone una buena lista de todas las roturas de enlaces simbólicos encuentra por debajo de la proporcionada del directorio. Pero creo que sería necesario para almacenar la ubicación de cada uno en una variable (matriz?) para trabajar con él.

Siguiente, parece que el cambio de la acción que se suministra en el "entonces" de una porción de la lógica, daría la solución.

El punto 2 puede ser recuperada mediante:

readlink /path/to/broken/symlink

Así que parece que tenemos que meter en una variable. Estoy claro sobre cómo hacer esto en la terminal.

Número 3 sería una simple edición de la ruta de acceso obtenido en el paso 2. Necesito reemplazar el antiguo nombre de la unidad, con el nuevo. Por lo que cambiar:

/Volumes/Old\ Drive/path/to/symlink

a

/Volumes/New\ Drive/path/to/symlink

También está claro exactamente cómo hacer esto dentro de una secuencia de comandos de la CLI. Algún tipo de cadena de reemplazo parece ser necesaria. Algo así como str_replace en el PHP mundo.

Finalmente el paso 4 se puede hacer a través de:

ln -f -s /path/to/new/location/of/original /path/to/location/of/broken/symlink/

como se detalla en mi otra pregunta, anteriormente vinculado anteriormente.

Cómo sería exactamente la cadena a estos conceptos juntos, para llevar a cabo mi resultado deseado de la fijación de todos mis enlaces simbólicos en una sola toma?

5voto

Desde la parte superior de mi cabeza (y sin ninguna prueba en absoluto):

  1. Crear un archivo de texto con el siguiente contenido

    #!/bin/bash
    
    find "$1" -type l | while read symlink; do
        if [ ! -e "$symlink" ]; then
            old_path=$(readlink "$symlink")
            new_path=${old_path/Old Drive/New Drive}
            ln -f -s "$new_path" "$symlink"
        fi
    done
    
  2. Hacerlo ejecutable por ejecutar chmod +x name-of-file

  3. Ejecutar ./name-of-file /path/to/search

Esto es probado así que prueba con una muestra de directorio de primera.


Añadir algunas explicaciones

  • old_path=$(readlink "$symlink") ejecuta el comando en $(...) y asigna el resultado a $old_path
  • ${old_path/Old Drive/New Drive} hace la sustitución de texto en $old_path

5voto

mtnygard Puntos 141

En un bash shell, para definir una variable, simplemente use set NAME=bob o set VITAL_SIGNS=none.

También puede establecer una variable mediante la salida de un comando llamando a la bash-función integrada read a asignar el resultado a una variable con nombre. Esto funciona bien en un tubo de corriente, así:

ls -l | wc -l | read NUMBER_OF_LINES

O usted puede asignar a la salida directamente a una variable así:

LICENSE_KEY=$(cat ~/software/key.txt | grep KEY | awk '{print $1}')

Una gran manera de forma recursiva leer las variables se encuentra en un bucle como el siguiente:

for BROKEN_LINK in $(commands to produce a list of files)
do
commands here to sort your links out, noting that the broken links are stored in the variable $BROKEN_LINKS
done

Con lo anterior en mente, algo así como el siguiente trabajo:

demostrar una carpeta no existe

StuffeMac:dan stuffe$ ls ~/Desktop/broken_links
ls: /Users/stuffe/Desktop/broken_links: No such file or directory

probar una nueva carpeta de destino no existe

StuffeMac:dan stuffe$ ls ~/Desktop/working_links
StuffeMac:dan stuffe$

crear algunos no válido válido y enlaces

StuffeMac:dan stuffe$ ln -s ~/Desktop/brokenlinks/dan1
StuffeMac:dan stuffe$ ln -s ~/Desktop/brokenlinks/dan2
StuffeMac:dan stuffe$ ln -s ~/Desktop/working_links/dan3
StuffeMac:dan stuffe$ ln -s ~/Desktop/outofscopedeadlinks/dan4
StuffeMac:dan stuffe$ ls -l
total 32
lrwxr-xr-x  1 stuffe  staff  38  8 Dec 10:06 dan1 -> /Users/stuffe/Desktop/brokenlinks/dan1
lrwxr-xr-x  1 stuffe  staff  38  8 Dec 10:06 dan2 -> /Users/stuffe/Desktop/brokenlinks/dan2
lrwxr-xr-x  1 stuffe  staff  40  8 Dec 10:06 dan3 -> /Users/stuffe/Desktop/working_links/dan3
lrwxr-xr-x  1 stuffe  staff  46  8 Dec 10:21 dan4 -> /Users/stuffe/Desktop/outofscopedeadlinks/dan4

agarra una lista de enlaces muertos en un archivo de entrada

StuffeMac:dan stuffe$ find . -type l | while read f; do if [ ! -e "$f" ]; then ls "$f" >> deadlinks.txt; fi; done
StuffeMac:dan stuffe$ more deadlinks.txt
./dan1
./dan2
./dan4

ejecutar un bucle en contra de cada link muerto

StuffeMac:dan stuffe$ for DEAD_LINK in $(cat deadlinks.txt)
> do
> DESTINATION_IN_SCOPE=$(readlink $DEAD_LINK | grep brokenlinks | wc -l)
> NEW_DESTINATION="~/Desktop/working_links/"
> if [ $DESTINATION_IN_SCOPE = "1" ]
> then
> NEW_LINK=$(echo $DEAD_LINK | colrm 1 2)
> ln -f -s $NEW_DESTINATION$NEW_LINK $DEAD_LINK
> else
> echo "Link $DEAD_LINK not in target folder"
> fi
> done
Link ./dan4 not in target folder
StuffeMac:dan stuffe$

echa un vistazo a los enlaces simbólicos después de ediciones

StuffeMac:dan stuffe$ ls -l
total 32
lrwxr-xr-x  1 stuffe  staff  28  8 Dec 10:08 dan1 -> ~/Desktop/working_links/dan1
lrwxr-xr-x  1 stuffe  staff  28  8 Dec 10:08 dan2 -> ~/Desktop/working_links/dan2
lrwxr-xr-x  1 stuffe  staff  40  8 Dec 10:06 dan3 -> /Users/stuffe/Desktop/working_links/dan3
lrwxr-xr-x  1 stuffe  staff  46  8 Dec 10:21 dan4 -> /Users/stuffe/Desktop/outofscopedeadlinks/dan4

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X