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
find
sustituirán en lugar de{}
incluirá$SOURCE
: por ejemplo, en su caso elexec
comando final se verá así:ln -s -- /home/user/www/public /var/www/home/user/www/public
. Resuelva este problema usandobasename
.en algunos sistemas (OS X), el directorio $SRC se incluirá en la lista de directorios
find
encontrados. Probablemente esto no sea lo que quieres. Resuelva este problema eliminando la primera línea defind
salida o agregando-not -name $(basename $SOURCE)
una cláusula.
Espero que esto ayude.