¿Cómo escribo un script que compara nombres de carpetas/enlaces simbólicos de dos carpetas diferentes?

¿Cómo escribo un script que compara nombres de carpetas/enlaces simbólicos de dos carpetas diferentes?

Necesito ayuda para escribir un script para crear enlaces simbólicos. Aquí hay un script que he estado ejecutando en segundo plano.

#!/bin/bash
SOURCE="/home/$USER/www"
DEST="/var/www"
while true; do
    find $SOURCE -maxdepth 1 -type d -not -name "old.**" -exec ln -s -- {} "$DEST"/{} \;
    find $DEST -maxdepth 1 -type l -exec test ! -e {} \; -delete
sleep 30
done

Ahora me gustaría que este script realice un par de tareas más.

  • Ignore las carpetas ya vinculadas y las carpetas con "antiguo". prefijo .
  • Elimine el enlace simbólico de $DEST si la carpeta principal no está disponible en $SOURCE.

Ayúdenme a agregar esas funciones en este script. Gracias.

Respuesta1

Sé que esto podría ser más engorroso de lo que esperaba, pero reescribiría la -exec ...parte como un script separado que obtiene un parámetro de entrada (el nombre del directorio al que se vinculará simbólicamente) y luego verificará si el vínculo simbólico ya existe (p. ej. if [ -h "$DEST/$1" ] ...) y, si es necesario , si se resuelve en una ubicación correcta (por ejemplo if [ $(readlink $DEST/$1) == $SOURCE/$1 ] ..., si ambas condiciones son verdaderas, omitimos el archivo; de lo contrario, se (re)crea el enlace simbólico.

Luego llamas a este script en la clase ejecutiva de esta manera: find $SOURCE -maxdepth 1 -type f -not -name "old.**" -exec make-symlink.sh {} \;

Un par de puntos más:

  • Los nombres de archivos que findsustituirán en lugar de{} incluirá$SOURCE: por ejemplo, en su caso el execcomando final se verá así: ln -s -- /home/user/www/public /var/www/home/user/www/public. Resuelva este problema usando basename.

  • en algunos sistemas (OS X), el directorio $SRC se incluirá en la lista de directorios findencontrados. Probablemente esto no sea lo que quieres. Resuelva este problema eliminando la primera línea de findsalida o agregando -not -name $(basename $SOURCE)una cláusula.

Espero que esto ayude.

información relacionada