Foros del Web » Administración de Sistemas » Unix / Linux »

Practica backup

Estas en el tema de Practica backup en el foro de Unix / Linux en Foros del Web. Buenas, en la universidad acabo de empezar con administración de linux y la verdad es que estoy un poco perdido, a ver si me podeis ...
  #1 (permalink)  
Antiguo 11/03/2015, 06:17
 
Fecha de Ingreso: abril-2007
Mensajes: 32
Antigüedad: 17 años, 6 meses
Puntos: 0
Pregunta Practica backup

Buenas, en la universidad acabo de empezar con administración de linux y la verdad es que estoy un poco perdido, a ver si me podeis echar una mano. El ejercicio dice esto:

Se pide realizar un programa que realice una copia de los directorios que cuelguen de ~/importante/ en media/backup , siguiendo las siguientes directivas:
* Cada directorio que cuelga de ~/importante/ deberá de guardarse en un fchero .tgz.
* Cada fchero de backup deberá de tener el nombre el nombre del directorio seguido de la fecha.
La fecha estará en formato año , mes , dia . Por ejemplo, para copiar el directorio docencia deberá
de tener el nombre docencia_20140404.tgz .

Este es mi código
Código BASH:
Ver original
  1. #!/bin/bash
  2.  
  3. #mientras exista el archivo y no esté vacío
  4. while [ -s ~/importante/ ]
  5. do
  6.   #obtengo la fecha en el formato año mes día (todo junto)
  7.   fecha = date +"%Y%m%d"
  8.   #Nos posicionamos en el origen
  9.   cd ~/importante/
  10.   #obtengo el primer fichero
  11.   fichero=`ls | head -1`
  12.   #formo el nombre para el fichero comprimido (nombre_fecha)
  13.   nombre="$fichero""_""$fecha"".tgz"
  14.   #comprimo un archivo
  15.   tar -zcvf $nombre cd /media/backup
  16.   #borro el fichero después de comprimirlo
  17.   sudo rm -rf $fichero
  18.   #muevo el fichero comprimido a la carpeta destino
  19.   sudo mv prueba /media/backup
  20.   #nos posicionamos en el destino
  21.   cd /media/backup
  22.   #cuento el numero de archivos
  23.   numero=ls | wc -l
  24.   if [$numero -gt 5]; then
  25.     #obtenego el fichero más atiguo
  26.     fichero=`ls -rt | head -1`
  27.     #borro el fichero obtenido
  28.     sudo rm -rf $fichero
  29.   fi
  30.   echo 'Backup realizado correctamente'
  31. done

como errores que me da:
- Crea el fichero comprimido en la carpeta "importante" pero de nombre le pone ".tgz .tgz .tgz ....." muchas veces
-Dentro del fichero comprimido me aparece /media/backup en lugar de los diversos directorios que hay en la carpeta "importante"
- Me da un bucle infinito, pero eso es normal ya que al ponerle el nombre ese tan raro al fichero comprimido, no se copia a /media/backup por lo que "importante" no se queda vacía nunca y no sale del bucle

Esto es lo que me devuelve la consola
Código Consola:
Ver original
  1. ./backup.sh: línea 28: [: falta un `]'
  2. Backup realizado correctamente
  3. ./backup.sh: línea 11: fecha: orden no encontrada
  4. tar: cd: No se puede stat: No existe el archivo o el directorio
  5. tar: Eliminando la `/' inicial de los nombres
  6. /media/backup/
  7. /media/backup/prueba/
  8. tar: Saliendo con fallos debido a errores anteriores
  9. mv: no se puede efectuar `stat' sobre «prueba»: No existe el archivo o el directorio
  10. 0

muchas gracias por vuestra ayuda

saludos
  #2 (permalink)  
Antiguo 11/03/2015, 07:54
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Practica backup

Primero que nada, tenés que eliminar los errores de sintaxis. Rápidamente se ven líneas con errores:

Código BASH:
Ver original
  1. #mientras exista el archivo y no esté vacío
  2. while [ -s ~/importante/ ] # ERROR: -s es para probar que un archivo tenga un tamaño mayor que cero, no para directorios
  3. do
  4.   #obtengo la fecha en el formato año mes día (todo junto)
  5.   fecha = date +"%Y%m%d" # ERROR, te faltan las comillas invertidas, o $()
  6.   #Nos posicionamos en el origen
  7.   cd ~/importante/
  8.   #obtengo el primer fichero
  9.   fichero=`ls | head -1`
  10.   #formo el nombre para el fichero comprimido (nombre_fecha)
  11.   nombre="$fichero""_""$fecha"".tgz"
  12.   #comprimo un archivo
  13.   tar -zcvf $nombre cd /media/backup #ERROR: dos comandos en la misma línea?
  14.   #borro el fichero después de comprimirlo
  15.   sudo rm -rf $fichero # ¿lo borras sin comprobar que tar haya creado el backup?
  16.   #muevo el fichero comprimido a la carpeta destino
  17.   sudo mv prueba /media/backup # ¿qué es "prueba"?
  18.   #nos posicionamos en el destino
  19.   cd /media/backup
  20.   #cuento el numero de archivos
  21.   numero=ls | wc -l # ERROR: de nuevo te faltan las comillas o $()
  22.   if [$numero -gt 5]; then # ERROR: siempre debe haber al menos un espacio después de [ y antes de ]
  23.     #obtenego el fichero más atiguo
  24.     fichero=`ls -rt | head -1`
  25.     #borro el fichero obtenido
  26.     sudo rm -rf $fichero
  27.   fi
  28.   echo 'Backup realizado correctamente'
  29. done

El motivo por el cual te da resultados extraños es que tenés un montón de errores básicos. Si te ponés a pensar en lo que realmente estás haciendo, todos los efectos que mencionás son producto de esos errores.
  #3 (permalink)  
Antiguo 11/03/2015, 14:20
 
Fecha de Ingreso: abril-2007
Mensajes: 32
Antigüedad: 17 años, 6 meses
Puntos: 0
Respuesta: Practica backup

En primer lugar muchas gracias por tu respuesta, bueno, a ver, se que tengo muchos errores, por eso comento aquí, por que por mi solo no se localizarlos ya que es el primer programa bash que hago, los comandos los he ido buscando por internet y en manuales para obtenerlos.

2.-¿Como puedo comprobar que un directorio no está vacío para ponerlo dentro del while?
5 y 21.-lo de las comillas, no se como se hace he probado a ponerlo fecha = `date` +"%Y%m%d" y así fecha = `date +"%Y%m%d"` pero de ninguna de las dos formas funciona
13.-al hacer el tar, pongo dos comandos en la misma linea porque le tengo que indicar la ruta destino, el cd se me ha colado. En esta linea esta lo que mas problemas me esta dando.
15.-¿Como compruebo que haya creado el backup?
17.-prueba es una carpeta de prueba que creo ahí se me ha colado, quedaría así: sudo mv $fichero /media/backup
  #4 (permalink)  
Antiguo 12/03/2015, 06:42
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Practica backup

2 - No hay forma directa de comprobar que un directorio no está vacío, no existe un "-s" para directorios. Sin embargo, hay opciones que podés usar. Para esta clase de dudas te recomiendo el sitio http://mywiki.wooledge.org/BashFAQ/, que tiene muchas soluciones para problemas como este. El ejemplo que pongo a continuación es del mismo sitio (http://mywiki.wooledge.org/BashFAQ/004)
Código BASH:
Ver original
  1. cd directorio_donde_vas_a_buscar
  2. # el siguiente comando shopt ('shell option') cambia la forma en que BASH expande los globs:
  3. # - nullglob: si el * no coincide con ningún archivo, desaparece en vez de generar una entrada *
  4. # - dotglob: * no coincide con las entradas '.' y '..' que existen en todo directorio
  5. shopt -s nullglob dotglob
  6. # creamos una matriz donde cada entrada es un archivo o directorio dentro del directorio actual
  7. files=(*)
  8. # en $files tenemos todas las entradas, bastaría con hacer un if que compruebe que ${#files[@]} es mayor que cero
  9. echo "The current directory contains ${#files[@]} things."
También podés simplemente iterar sobre todos los subdirectorios de ~/importante con un código como este:
Código bash:
Ver original
  1. for DIR in ~/importante; do
  2.     if [[ -d $DIR ]]; then
  3.         # DIR es un directorio, seguir
  4.     else
  5.         # DIR no es un directorio, saltear
  6.     fi
  7. done

5,21- La forma correcta es
Código BASH:
Ver original
  1. VAR=$(comando)
o
Código BASH:
Ver original
  1. VAR=`comando`
Lo que te está fallando es que NO debe haber espacios entre el nombre de la variable y el signo de igual, ni entre el signo de igual y el valor que se quiere asignar a la variable. En tu caso, deberías usar
Código BASH:
Ver original
  1. fecha=$(date +%Y%m%d)
, siendo en este caso opcionales las comillas en el argumento de date

13- Si ese es el caso, lo que debes hacer es algo como
tar -zcvf /media/backup/$nombre .
El punto al final es el directorio que querés comprimir, la idea es que uses el nombre del directorio que querés comprimir. Lee el manual de tar para conocer el orden de los parámetros.

14- Esto lo podés hacer comprobando el código de salida de tar, o probando si el archivo .tgz existe. En ambos casos usas variantes de if

17- Cuidado con eso, porque una línea antes estás borrando $fichero, con lo que el mv te fallaría siempre. Creo que quisiste decir que sería $nombre, no $fichero. En cualquier caso, si arreglas la línea de tar como te lo sugiero arriba, este mv es innecesario.

A propósito: no uses sudo en scripts. En vez de eso, asegúrate de que los permisos en los archivos y carpetas sobre los que vas a trabajar son los apropiados para que todo funcione.


Saludos.

Etiquetas: backup, linux
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:49.