Problema con script de backup (solucionado)

Imagen de doublesoyyo
0 puntos

Buenas,

A ver si alguien me puede echar una mano con esto que ya me estoy volviendo loco...Tengo un hacer una practica que me pide un script que dependiendo de los parametros que le pase, me haga una copia de unos archivos o de otros.

Si pongo backup E me hara una copia de los directorios dentro de la variable $PATH.

Si pongo backup D hara una copia de todos los .dat a partir de /

Tengo 2 dudas: una es como hacer la copia de todos los .dat, ya que he probado:

cp *.dat /backups

La otra duda es como hacer que me coja los parametros y dependiendo del parametro, me ejecute uno u otro.

Adjunto lo que llevo de script, para ver si sirve de algo:

 

#!/bin/bash
#
#
#
if [ $# -ne 1 ]
then
# Si no tiene ningun parametro, realizar backup completo
# Hacemos copia de todos los ejecutables de la variable PATH
cp -r /usr/local/sbin /backups/"$(date +%Y-%m-%d)_backup_programas;
cp -r /usr/local/bin /backups/"$(date +%Y-%m-%d)_backup_programas;
cp -r /usr/sbin /backups/"$(date +%Y-%m-%d)_backup_programas;
cp -r /usr/bin /backups/"$(date +%Y-%m-%d)_backup_programas;
cp -r /sbin /backups/"$(date +%Y-%m-%d)_backup_programas;
cp -r /bin /backups/"$(date +%Y-%m-%d)_backup_programas;
cp -r /usr/games /backups/"$(date +%Y-%m-%d)_backup_programas;
#Ahora realizamos la copia de los archivos de datos


# en caso de que se meta un parametro
else
if [ $# -ne 2 ]
then
if [$# -eq E ]
then
#Si el parámetro pasado es E, realizaremos solo la copia de ejecutables
cp -r /usr/local/sbin /backups/"$(date +%Y-%m-%d)_backup_programas;
cp -r /usr/local/bin /backups/"$(date +%Y-%m-%d)_backup_programas;
cp -r /usr/sbin /backups/"$(date +%Y-%m-%d)_backup_programas;
cp -r /usr/bin /backups/"$(date +%Y-%m-%d)_backup_programas;
cp -r /sbin /backups/"$(date +%Y-%m-%d)_backup_programas;
cp -r /bin /backups/"$(date +%Y-%m-%d)_backup_programas;
cp -r /usr/games /backups/"$(date +%Y-%m-%d)_backup_programas;
else
if [ $# -eq D ]
then
#Si el parametro es D, se hara el backup de todos los archivos .dat

else echo "Parametro/s equivocado/s. Ejecute el comando E para copiar ejecutables, D para datos, sin parametros para todo"
fi
fi
fi
fi

Un saludo,

Gonzalo

Imagen de LoquitoSlack
+1
0
-1

reviza esta direccion

http://dymas.ii.uam.es/~flh/macprog/bash.pdf

pagina 88 te da una idea como trabajar con argumentos...

$./backup -E

sino me equivoco $#cuenta la cantidad de variables administradas..

$./script <variable1><variable2>

pero para parametros

$./script -<variable> -> el menos delante

umm espero que leyendo el manual te ayude me he animado hacerlo para recordad un poco de bash

 

kike 

+1
0
-1

loquitoslack

Imagen de LoquitoSlack
+1
0
-1

#!/bin/bash
while getopts "ED" opt
do
case $opt in
        E)echo "Haciendo backup de la variable PATH..."
                path=$PATH
                mkdir -p /Backups/$(date +%Y-%m-%d)_backupsProgramas
                variabledir="/Backups/$(date +%Y-%m-%d)_backupsProgramas"
                while [ $path ]
                do
                        cp -rf "${path%%:*}" $variabledir &>/dev/null
                        if [ ${path#*:} = $path ]; then
                                path=
                        else
                                path=${path#*:}
                        fi
                done;;
        A)echo "Copiando archivos .dat"
                #definiendo variable dir
                variabledir="/Backups/$(date +%Y-%m-%d)_backupsProgramas"
                find /home/sislab109 -name "*.dat" > fichero
                while read dat
                do
                        echo $dat
                        cp -rf "$dat" $variabledir
                done<fichero;;
        \?) echo "Opcion errada"
            exit 1;;
esac
done
shift $(($OPTIND -1))

 

bash 3.1 $sudo ./Backup -<opcion>

donde opcion es E o D 

+1
0
-1

loquitoslack

Imagen de doublesoyyo
+1
0
-1

Hola Kike y LoquitoSlack,

 En primer lugar, muchas gracias por contestar tan rápido.

Estaba mirando el manual que me ha indicado Kike y voy a probar el script que me ha puesto LoquitoSlack, así que ahora os cuento que tal ha ido.

+1
0
-1
Imagen de brunov
+1
0
-1

Con respecto a cómo copiar los archivos .dat, te puede llegar a ser útil el comando find:

 find -type f -name '*.dat' -exec cp {} /carpeta/destino \;

La ventaja que tiene es que busca recursivamente en todos los subdirectorios. El modificador "-exec" ejecuta el comando que lo sigue reemplazando {} por el nombre de archivo encontrado.

+1
0
-1
Imagen de doublesoyyo
+1
0
-1

Oleeeeeeeeeeeeee,

Muchas gracias, a parte de que funciona, ha quedado mucho mas profesional que la cutrería que tenía hecha.

Lo único que le falta al script es que en caso de que no metamos ningun parametro, tiene que hacer ambos, que me imagino que con la condicion esta me valdrá:

 

if [ $# -ne 1 ] 
then

 

Muchas gracias a todos por las aportaciones.

Un saludo,

Gonzalo

+1
0
-1
Imagen de slap
+1
0
-1

Hola.
Recordad que cuando solucionéis vuestra duda o problema, deberíais marcar el hilo como "Solucionado" y, además, editar el título y a ñadir al final del mismo: "(solucionado)". Esto ayudará a otros usuarios a la hora de buscar soluciones a sus problemas.

Gracias por colaborar.
Saludos.


Miembro del equipo de moderadores
+1
0
-1

Saludos.

0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://www.injiniero.es

Imagen de doublesoyyo
+1
0
-1

Hola Slap,

 Perdona que no haya puesto antes lo de tema solucionado, ya que quería pedir como último favor, que me ayudaran a comentar el código, ya que hay un par de sentencias que no sé que hacen exactamente, aunque ya esta probado el código y va a la perfección ;)

 Las dudas en concreto son las resaltadas en negrita:

.... 

         D)echo "Copiando archivos.dat"
                #definiendo variable dir
                mkdir -p /Backups/$(date +%Y-%m-%d)_backups_datos
                variabledir="/Backups/$(date +%Y-%m-%d)_backups_datos"
                find / -name "*.dat" > fichero
                while read dat
                do
                        echo $dat
                        cp -rf "$dat" $variabledir
                done<fichero

....

 esac
done
shift $(($OPTIND -1))
fi

Un saludo y gracias a todos. 

 

+1
0
-1
Imagen de slap
+1
0
-1

En el bucle:

while read dat
do
...
done<fichero

read obtiene los datos del fichero: fichero por la redirección de entrada que se hace en done<fichero.

El shift $(($OPTIND-1)) no tiene mucho sentido en este script.
Lo que hace es descartar los parámetros que ya ha leído getopts, de esta forma, la variable $1 apuntaría al primer parámetro que lleve el script después de los parámetros procesados por getopts.

Para saber más: man bash
y busca getopts

Saludos.
slap

+1
0
-1

Saludos.

0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://www.injiniero.es

Imagen de doublesoyyo
+1
0
-1

Hola Slap,

Gracias por responder tan rápido.

Creo que si está bien que este lo del shift... por si acaso meten directamente backup -D -E. Primero hara el -D y luego hará el -E.

 Por lo tanto, hilo solucionado :)

 Un saludo,

Gonzalo 

+1
0
-1
Imagen de doublesoyyo
+1
0
-1

Buenas,

Como ultima duda, he programado este script para que se realice de la siguiente manera:

00 1 * * * /ssoo/copia -D -E

para que se ejecute diariamente a la 1 todos los días, pero no me funciona.

+1
0
-1
Imagen de LoquitoSlack
+1
0
-1

No sera de esta forma

00 1 * * * /ssoo/./copia -D -E

./-->para ejecutar el script 

+1
0
-1

loquitoslack