PDA

Ver la versión completa : [Ayuda] copias de seguridad en bash



serlioner
15/03/2014, 15:22
hola, estoy trabajando en un script para realizar copias de seguridad de un directorio y que me cambie a mayúscula todos los nombres de directorios y subdirectorios de la carpetas copiadas, conseguí que me cambiara del directorio principal, pero al entrar en un subdirectorio los nombres están en minúscula, y ya llegue a un nivel que quiero conseguirlo como sea, probé varias cosas pero no me dan un resultado completo, y usando find -exec rename 'tr/a-z/A-Z/' "{}" \+ solo cambia del primero directorio, si alguien supiera como hacer esto le estaría muy agradecido, por que ya es cabezonería de o me sale o reviento, muchas gracias por adelantado.

juanvvc
15/03/2014, 16:16
¡Interesante ejercicio! Ahí va mi propuesta:



tree -dfi --noreport | tac | while read r; do d=$(dirname "$r") ; d2=$(basename "$r" | tr [:lower:] [:upper:]); mv "$r" "$d/$d2"; done


Diseccionemos:

tree -dfi --noreport Lista los directorios y subdirectorios del directorio actual (-d), incluyendo el path completo (-f) y sin formateos raros (-i) ni resúmenes finales (--noreport)
tac invierte la lista. Este es el problema que tiene tu comando: primero cambia los directorios de primer nivel y luego trata de cambiar los de segundo nivel... pero el nombre del directorio de primer nivel ya ha cambiado y por eso no puede encontrar los de segundo nivel. Así que tienes que hacerlo al revés, primero los de segundo nivel y luego los de primer nivel. Para eso está tac.
while read r; do .... ; done Pues eso: para cada directorio, guardamos en r el path completo...
d=$(dirname "$r") guardamos en d el nombre del padre
d2=$(basename "$r" | tr [:lower:] [:upper:]) guardamos en d2 su nombre pasado a mayúsculas
mv "$r" "$d/$d2" renombramos

Edit: por lo que veo, tu comando find no filtra por directorios (no incluye la opción "--type d") ¿Puede ser que aunque no lo digas en tu mensaje, también quieres cambiar el nombre de los archivos? En ese caso, quita el parámetro "-d" del tree.

serlioner
15/03/2014, 16:46
muchas gracias, me encanta esta comunidad, estoy haciendo el script en bash y me dice que tree -dfi --noreport no me lo reconoce como comando (y exactamente como dijiste, también quiero actuar sobre archivos se me olvido comentarlo), se que abuso ya mucho, pero si pudieses decirme una solución en bash si la conoces no sabes lo agradecido que te estaría.

juanvvc
15/03/2014, 18:13
¿E instalar tree?

En debian y derivados: apt-get install tree

Alternativamente puedes intentar un simple find, pero ya no lo he probado a ver si hay algo raro. El comando queda así:



find . | tac | while read r; do d=$(dirname "$r") ; d2=$(basename "$r" | tr [:lower:] [:upper:]); mv "$r" "$d/$d2"; done

serlioner
15/03/2014, 18:29
muchiisimas gracias ahora si, me voy a tatuar la linea, es que estoy empezando con bash y soy bastante novato pero lo cogí con ganas y soy muy cabezón, si eres de córdoba dime que te invito a una cerveza.

^MiSaTo^
15/03/2014, 19:56
prueba con la opción -depth de find.
find <dir> -depth -exec rename 'tr/a-z/A-Z/' {} \;
(aunque creo que rename ya trae una opción para eso, no se si -c)
Ahora mismo no puedo probarlo y lo digo de memoria así que no se si funcionará. Pero no hace falta instalar tree ni nada así ;)

juanvvc
15/03/2014, 23:12
Wow, sí, mirando el manual parece que la opción depth del find solucionaría tu problema. Ni idea de que existía.