Soy nuevo en bash, así que estoy un poco perdido con este script que he hecho para hacer una copia de seguridad de algunos directorios de la máquina local en un NAS. El NAS sólo contendrá un número determinado de archivos respaldados, por lo que antes de copiar uno nuevo borro el más antiguo de los existentes.
En primer lugar el script define todas las rutas, nombres de directorios y archivos en variables
# Defines directories
ORIGEN='/Library/path-to-directories/'
DESTINAS='/Volumes/path-to-backup/'
DESTITAR='/Library/path-to-temp/'
# Defines names of the files and folders to delete (OLDDIR) and copy (NEWDIR)
OLDTAR=`/bin/ls /Volumes/path-to-backup/ | head -n 1`
NEWDIR=`/bin/ls /Library/path-to-directories/ | tail -n 1`
A continuación, utilizando los nombres de las variables: Crea un archivo comprimido en tar desde el directorio original. El archivo tar se guarda en un directorio separado y temporal.
/usr/bin/sudo /usr/bin/tar -czf "$DESTITAR$NEWDIR.tgz" "$ORIGEN$NEWDIR"
Elimina el más antiguo de los archivos tar del NAS:
/usr/bin/sudo /bin/rm $DESTINAS$OLDTAR
Copia el archivo tar en el NAS:
/usr/bin/sudo /bin/cp -Rp "$DESTITAR$NEWDIR.tgz" $DESTINAS
Elimina el archivo tar del directorio temporal:
/usr/bin/sudo /bin/rm -f "$DESTITAR$NEWDIR.tgz"
El script se ejecuta de forma desatendida por un usuario que ha sido debidamente autorizado mediante cambios en el archivo sudoers. Todo se ejecuta sin problemas excepto en este paso:
/usr/bin/sudo /bin/rm $DESTINAS$OLDTAR
El archivo de registro no muestra errores pero no hay nada en el lugar del $OLDTAR
variable, como que no está resuelta, por lo que realmente se ejecuta:
/usr/bin/sudo /bin/rm /Volumes/path-to-backup/
Sin embargo si ejecuto los comandos en la terminal uno a uno consigo que funcione bien. ¿Puede ser un problema de permisos de usuario?
0 votos
Es un problema de permisos, el usuario que ejecuta el script puede escribir pero no leer en el directorio de destino. ¿Cómo es esto posible? los permisos en el
OLDTAR
directorio son:drwxrwxrwx 1 admin staff
0 votos
Si, en lugar de ejecutar el
rm
utiliceecho $DESTINAS$OLDTAR
¿qué produce?0 votos
@Allan: parece correcto, compone la ruta completa y el nombre del archivo.
0 votos
¿hay plazas?
0 votos
@Allan nope, es
filename_YYYY-MM-DD_HHMM.tgz
0 votos
Compruebe si existe mediante
if [ -f $DESTINAS$OLDTAR ] then rm -f "$DESTITAR$NEWDIR.tgz" else echo "file not there" fi
Añade esta sentencia condicional a tu script.0 votos
Además, ¿puedes publicar todo el script. Depurar línea por línea como lo tienes es doloroso.
0 votos
Utilice
set -x
después delshebang
( por ejemplo#!/bin/bash
) en su script para ayudar a diagnosticar. Utilice también: http://www.shellcheck.net/0 votos
Por favor, añade el script original sin modificar. Tu problema podría ser tan simple como un error tipográfico al configurar OLDTAR pero no hay forma de comprobarlo ahora mismo.