elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  [Bash] Script de copia-backup archivos nuevos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Bash] Script de copia-backup archivos nuevos  (Leído 7,774 veces)
sclub


Desconectado Desconectado

Mensajes: 591


Ver Perfil
[Bash] Script de copia-backup archivos nuevos
« en: 19 Diciembre 2010, 21:38 pm »

holaaa!!

aver, estoy intentando hacer un script que me sincronize dos unidades, una que me lllevo d'aquí p'allá, y la otra que la tengo en casa siempre.
El codigo es este:
Código
  1. #!/bin/bash
  2.  
  3. copiaRecurs() {
  4. src="$1"
  5. dst="$2"
  6. for file in $(ls $src)
  7. do
  8. if [ -d "$src/$file" ]; then
  9. if [ ! -e "$dst/$file" ]; then
  10. mkdir "$dst/$file"
  11. fi
  12. `copiaRecurs "$src/$file" "$dst/$file"`
  13. else
  14. if [ "$src/$file" -nt "$dst/$file" ]; then
  15. cp "$src/$file" "$dst/$file"
  16. fi
  17. fi
  18. done
  19. }
  20.  
  21. pathB="/media/BOX"
  22. pathS="/media/STORE"
  23.  
  24. boxSof="Softw"
  25. strSof="Software"
  26. boxDoc="Doc"
  27. strDoc="Documentacio"
  28. boxImg="Images"
  29. strImg="Images"
  30.  
  31. if [ ! -d $pathB ]; then
  32. echo "BOX isn't ready!"
  33. exit
  34. else
  35. if [ ! -d $pathS ]; then
  36. echo "STORE isn't ready!"
  37. exit
  38. fi
  39. fi
  40.  
  41. copiaRecurs "$pathB/$boxImg" "$pathS/prova"
  42.  
  43. echo "Cool!!"
  44.  

El problema que estoy teniendo es que no me copia todo... alguna carpeta me la deja vacia. Aparte mientras se esta copiando saltan algunos 'errores' como estos:
Código:
./scripts/syncro.sh: line 12: `/media/BOX/Images/Amsterdam\'08/Peke/DSC06339.JPG': No such file or directory
./scripts/syncro.sh: line 12: `/media/BOX/Images/BBQ(Sept\'09)/DSC00824.JPG': No such file or directory
./scripts/syncro.sh: line 12: `/media/BOX/Images/ClasseESI/Thumbs.db': No such file or directory
./scripts/syncro.sh: line 12: `/media/BOX/Images/Dublin\'09/Adventures/DSC02777.JPG': No such file or directory

Pero esos archivos SÍ existen, es más, me los copia al destino... nose... la cosa es que de una carpeta de 10gb de fotos, 1gb no se ha copiado... y solo tengo localizada una carpeta vacia... el resto deben ser fotos sueltas...
Alguien ve algo raro en el codigo¿??? Estoy empezando a hacerme mis scripts y me lio un poco.

Por otro lado, eso no es lo mismo que un cp -r verdad?? el cp -r sobreescribiria en cualquier caso, sea nuevo o no... correcto??

Bueno, gracias por leer!!

Saludos!

EDIT ---
Cambio el titulo porque al final no he usado recursividad. Código al final.


« Última modificación: 23 Diciembre 2010, 22:53 pm por sclub » En línea

... because making UNIX friendly is easier than debugging Windows.
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Recursividad en bash
« Respuesta #1 en: 20 Diciembre 2010, 07:21 am »

¿qué es lo que quieres hacer con ese script?

Lo digo para ver si hallamos otra alternativa.


En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
sclub


Desconectado Desconectado

Mensajes: 591


Ver Perfil
Re: Recursividad en bash
« Respuesta #2 en: 20 Diciembre 2010, 13:53 pm »

Pues lo que quiero es que yo le de al script, y me copie todos los archivos de BOX a STORE(son 2 HDD's).

Basicamente copia todo a otro HDD, pero solo si su igual en el destino no existe o es mas viejo. Porque sino seria mucho procesador gastado en vano... almomejor yo hay dias que solo he modificado 2 archivos de todo lo que quiero que se copie, pues solo se copiaran esos 2, no todo...

se te ocurre alguna manera mejor¿??? Se me ocurrio que el cp podria tener una opció que compruebe eso(-nt, -ot), pero no la encontré en el man... se me pasó o no la hay¿?

Saludos!!
En línea

... because making UNIX friendly is easier than debugging Windows.
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Recursividad en bash
« Respuesta #3 en: 20 Diciembre 2010, 18:31 pm »

A mi se me ocurre usar find con sus test's, find trabaja de manera rápida.

Código
  1. TESTS
  2.       Some tests, for example -newerXY and -samefile, allow comparison between the file currently being examined and some reference file specified on  the  command  line.
  3.       When  these  tests are used, the interpretation of the reference file is determined by the options -H, -L and -P and any previous -follow, but the reference file is
  4.       only examined once, at the time the command line is parsed.  If the reference file cannot be examined (for example, the stat(2) system call fails for it), an  error
  5.       message is issued, and find exits with a nonzero status.
  6.  
  7.       Numeric arguments can be specified as
  8.  
  9.       +n     for greater than n,
  10.  
  11.       -n     for less than n,
  12.  
  13.       n      for exactly n.
  14.  
  15.       -amin n
  16.              File was last accessed n minutes ago.
  17.  
  18.       -anewer file
  19.              File  was last accessed more recently than file was modified.  If file is a symbolic link and the -H option or the -L option is in effect, the access time of
  20.              the file it points to is always used.
  21.  
  22.       -atime n
  23.              File was last accessed n*24 hours ago.  When find figures out how many 24-hour periods ago the file was last accessed, any fractional part is ignored, so  to
  24.              match -atime +1, a file has to have been accessed at least two days ago.
  25.  
  26.       -cmin n
  27.              File's status was last changed n minutes ago.
  28.  
  29.       -cnewer file
  30.              File's status was last changed more recently than file was modified.  If file is a symbolic link and the -H option or the -L option is in effect, the status-
  31.              change time of the file it points to is always used.
  32.  
  33.       -ctime n
  34.              File's status was last changed n*24 hours ago.  See the comments for -atime to understand how rounding affects  the  interpretation  of  file  status  change
  35.              times.
  36.  
  37.       -empty File is empty and is either a regular file or a directory.
  38.  

find combinado con -exec, investigalo bien, seguro que te ayuda.
Código:
http://content.hccfl.edu/pollock/unix/findcmd.htm
En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
sclub


Desconectado Desconectado

Mensajes: 591


Ver Perfil
Re: Recursividad en bash
« Respuesta #4 en: 21 Diciembre 2010, 00:10 am »

Código
  1. #!/bin/bash
  2.  
  3. IFS=$'\x0A'$'\x0D'
  4.  
  5. copiaRecurs() {
  6. srcFolder="$1"
  7. dstFolder="$2"
  8.  
  9. cd $srcFolder
  10.  
  11. for srcFile in $(find .)
  12. do
  13.  
  14. dstFile="$dstFolder/$srcFile"
  15. if [ -d "$srcFile" ]; then
  16. if [ ! -e "$dstFile" ]; then
  17. mkdir "$dstFile"
  18. fi
  19. else
  20. if [ ! -e "$dstFile" ]; then
  21. cp "$srcFile" "$dstFile"
  22. else
  23. #find "$srcFile" -cnewer "$dstFile" -exec sh -c 'exec cp -f "$@" $dstFile' find-copy {} +
  24. if [ "$srcFile" -nt "$dstFile" ]; then
  25. cp -f "$srcFile" "$dstFile"
  26. fi
  27. fi
  28. fi
  29. done
  30. }
  31.  
  32. pathB="/media/BOX"
  33. pathS="/media/STORE"
  34.  
  35. copiaRecurs "$pathB/prova" "$pathS/prova"

Me ha venido bien el find! ;) el problema fue que los espacios me los detectaba como un salto de linea y me daba error... al final encontre que si canviaba los caracteres que se imprimian con el espacio(IFS) podia poner unos que son tratados correctamente. :)

Pero segui teniendo un problema... no me actualizaba los archivos. Copiaba lo que no existia, pero si ya existia otro paquete más viejo... me daba error.
Citar
# ./syncro.sh
cp: missing destination file operand after `./jkuadgs'
Try `cp --help' for more information.
Eso con el find... supongo que porque no lo se usar correctamente.

Entonces simplemente decicdi comprobarlo con un if y copiar manualmente. Y ya parece que va bien!

Le ves algún inconveniente a este metodo?? o ves algún fallo con la linea del find??

Saludos y gracias!!
En línea

... because making UNIX friendly is easier than debugging Windows.
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Recursividad en bash
« Respuesta #5 en: 21 Diciembre 2010, 07:37 am »

La sintaxis sería:

find OPCIONES -exec cp -f {} DESTINO \;

Te dejo un ejemplo:


Código
  1. leo@leo-desktop:~/Escritorio$ find . -type f -iname "vocabulario.txt" -exec cp -vf {} /home/leo/ \;
  2. «./vocabulario.txt» -> «/home/leo/vocabulario.txt»
  3. leo@leo-desktop:~/Escritorio$
  4.  

{} Hace referencia al archivo en cuestión.
/home/leo/ sería el destino.

\; Necesario para terminar el find.
En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
sclub


Desconectado Desconectado

Mensajes: 591


Ver Perfil
Re: Recursividad en bash
« Respuesta #6 en: 21 Diciembre 2010, 19:50 pm »

Perfecto!!! ;-) Ya funciona!

El problema es que no sabia como se usaba el -exec y no encontre una explicación clara con buenos ejemplos que reflejaran mi caso. Pero ahora ya está!! Muchas gracias!!! ;)

Aunque sigo teniendo una duda, las rutas con las que trabajo son así:
Citar
/media/BOX/./Images/
y queria sustituirlo por:
Citar
/media/BOX/Images/

así que probe con esto:
Código
  1. dstFile=$(sed 's/"./"/"$dstFolder"/' "$srcFile")
y con esto:
Código
  1. dstFile=$(echo "$srcFile" | sed -e 's/"./"/"$dstFolder"/')
con este error:
Citar
sed: -e expression #1, char 8: unknown option to `s'

o así:
Código
  1. dstFile=$(echo "$srcFile" | sed -e 's/".\/"/"$dstFolder"/')
sin ningún error, pero sin resultado.

Imagino como no, que el problema será la sintaxis... aver si lo arreglo.
De todas formas, muchas gracias por la ayuda!! Qué de mi sin tí.... xDD

Saludos!!
« Última modificación: 21 Diciembre 2010, 19:55 pm por sclub » En línea

... because making UNIX friendly is easier than debugging Windows.
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Recursividad en bash
« Respuesta #7 en: 21 Diciembre 2010, 22:10 pm »

Pon el código completo, por favor, para que otros vean cómo quedó.

Respecto a sed.

Código
  1. echo -e "$string" | sed "s/\.\///g"
En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
sclub


Desconectado Desconectado

Mensajes: 591


Ver Perfil
Re: Recursividad en bash
« Respuesta #8 en: 23 Diciembre 2010, 22:52 pm »

Claro!! El retraso fue que me quedé sin cargador del portatil...  :¬¬

Código completo:
Código
  1. #!/bin/bash
  2.  
  3. IFS=$'\x0A'$'\x0D'
  4.  
  5. copiaRecurs() {
  6. srcFolder="$1"
  7. dstFolder="$2"
  8.  
  9. cd $srcFolder
  10.  
  11. for srcFile in $(find .)
  12. do
  13. srcFile=$(echo -e "$srcFile" | sed "s/\.\///g")
  14. dstFile="$dstFolder/$srcFile"
  15.  
  16. if [ -d "$srcFile" ]; then
  17. if [ ! -e "$dstFile" ]; then
  18. mkdir -v "$dstFile"
  19. fi
  20. else
  21. if [ ! -e "$dstFile" ]; then
  22. cp -v "$srcFile" "$dstFile"
  23. else
  24. find "$srcFile" -cnewer "$dstFile" -exec cp -fv {} "$dstFile" \;
  25. fi
  26. fi
  27. done
  28. }
  29.  
  30. pathB="/media/BOX"
  31. pathS="/media/STORE"
  32.  
  33. fldDAISrc="CFGS DAI2"
  34. fldDAIDst="Workstore/CFGS DAI2"
  35. fldSof="Softw"
  36. fldDoc="Doc"
  37. fldImg="Images"
  38.  
  39. if [ ! -d $pathB ]; then
  40. echo -e "BOX isn't ready!"
  41. exit
  42. else
  43. if [ ! -d $pathS ]; then
  44. echo -e "STORE isn't ready!"
  45. exit
  46. fi
  47. fi
  48.  
  49. echo -e "-----------------------"
  50. echo -e " 1.- Update Software"
  51. echo -e " 2.- Update Homework"
  52. echo -e " 3.- Update Doc"
  53. echo -e " 4.- Update Pictures"
  54. echo -e " 5.- Update Everything"
  55. echo -e "-----------------------"
  56. echo -e " 6.- Custom Update"
  57. echo -e "-----------------------"
  58. read -p "  Option: " opc
  59.  
  60. case $opc in
  61. 1)
  62. copiaRecurs "$pathB/$fldSof" "$pathS/$fldSof";;
  63. 2)
  64. copiaRecurs "$pathB/$fldDAISrc" "$pathS/$fldDAIDst";;
  65. 3)
  66. copiaRecurs "$pathB/$fldDoc" "$pathS/$fldDoc";;
  67. 4)
  68. copiaRecurs "$pathB/$fldImg" "$pathS/$fldImg";;
  69. 5)
  70. copiaRecurs "$pathB/$fldSoft" "$pathS/$fldSoft"
  71. copiaRecurs "$pathB/$fldDAISrc" "$pathS/$fldDAIDst"
  72. copiaRecurs "$pathB/$fldDoc" "$pathS/$fldDoc"
  73. copiaRecurs "$pathB/$fldImg" "$pathS/$fldImg"
  74. ;;
  75. 6)
  76. echo -e "----------------------------------------------"
  77. echo -e " Both paths must exist before start copying!!"
  78. echo -e "----------------------------------------------"
  79. read -p "Enter the full source path: " srcCustom
  80. if [ ! -d $srcCustom ]; then
  81. echo -e "The path you provided do not exist!"
  82. else
  83. read -p "Enter the full destination path: " dstCustom
  84. if [ ! -d $dstCustom ]; then
  85. echo -e "The path you provided do not exist!"
  86. else
  87. copiaRecurs $srcCustom $dstCustom
  88. fi
  89. fi
  90. ;;
  91. esac
  92.  
  93. echo "Cool!!"
  94.  

Se me ha ocurrido ponerle una barra de progreso y alguna tonteria más, por trastear un poco más con bash, pero de momento ya cumple su función. :D

Gracias por la ayuda!
« Última modificación: 23 Diciembre 2010, 22:54 pm por sclub » En línea

... because making UNIX friendly is easier than debugging Windows.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ayuda con recursividad
.NET (C#, VB.NET, ASP)
eagle17 2 3,447 Último mensaje 1 Marzo 2009, 10:29 am
por bitarray
Recursividad
Java
rjrn 8 10,079 Último mensaje 17 Marzo 2009, 19:33 pm
por weirdtyping
recursividad
Ejercicios
Choclito 0 3,721 Último mensaje 12 Mayo 2009, 04:47 am
por Choclito
Recursividad
Programación C/C++
Abanda_9 4 5,158 Último mensaje 29 Mayo 2010, 04:09 am
por Abanda_9
[Bash script] equivalente de goto en batch para bash (SOLUCIONADO)
Scripting
moikano→@ 4 16,540 Último mensaje 4 Noviembre 2010, 15:58 pm
por moikano→@
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines