crear una carpeta en multiples directorios- script bash - SOLUCIONADO -

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: akodo, maiku

Responder
es175ed
Forista Nuevo
Forista Nuevo
Mensajes: 10
Registrado: Sab Ago 04, 2012 8:06 pm

crear una carpeta en multiples directorios- script bash - SOLUCIONADO -

Mensaje por es175ed » Sab Ago 04, 2012 8:11 pm

Hola:

Con find /ruta -type d encuentro la carpetas donde quiero crear una nueva ( en todos los directorios que muesta find ).
Le he pasado una tuberia a find con xargs y exec, pero no acabo de dar con la solucion. Solo consigo que se cree en mi home.
¿Como tendria que hacerlo?

Gracias de antemano.
Un saludo.
Última edición por es175ed el Mar Ago 07, 2012 3:28 pm, editado 2 veces en total.
Avatar de Usuario
tuxman
Forista Distinguido
Forista Distinguido
Mensajes: 1026
Registrado: Lun Feb 26, 2007 8:00 am
Ubicación: Guadalajara, Jalisco. Mexico
Contactar:

Re: crear una carpeta en multiples directorios

Mensaje por tuxman » Sab Ago 04, 2012 8:42 pm

Si es que comprendo bien tu problema, ¿buscas crear una carpeta llamada "Algo" (el nombre tu lo defines, claro) en todas y cada una de las rutas que te muestre find?

Por ejemplo, si find te muestra:

/home/pepe/
/home/pepe/carpeta/
/home/

Buscarías crear:

/home/pepe/Algo/
/home/pepe/carpeta/Algo/
/home/Algo/

¿Es correcto?

De ser así, creo que sería mas sencillo emplear un script Bash. Necesitarías poder leer la salida de find linea a linea, y a cada linea concatenarle el nombre de tu carpeta a crear, para luego solicitar su creación con mkdir, para luego leer otra linea.

Si te fijas, creo que ocuparías un ciclo en tu script, aunque necesitaríamos mas detalles del problema para visualizar una mejor respuesta.
Edita los nombres de tus post con "[SOLUCIONADO]" cuando encuentres una solución a tu problema.

Lenovo G470
Intel Core i3 2.1 GHz (2310M)
Chakra Linux.
es175ed
Forista Nuevo
Forista Nuevo
Mensajes: 10
Registrado: Sab Ago 04, 2012 8:06 pm

Re: crear una carpeta en multiples directorios

Mensaje por es175ed » Sab Ago 04, 2012 9:57 pm

Exactamente es eso.
He introducido a un amigo en linux y a veces no tengo las repuestas a sus preguntas.
He estado buscando un script para hacerlo pero no encontre nada.
Todavia no se como construirlos.
Para copiar un archivo a multiples directorios encntre esto.

find . -type d -exec cp archivo texto {}/ \;

He sustituido el archivo de texto por una carpeta pero no me funciona.
Si puedes indicarme como hacer el script te lo agradecere.

Saludos
Avatar de Usuario
niky45
Forista Ancestral
Forista Ancestral
Mensajes: 9186
Registrado: Jue Abr 12, 2007 7:00 am
Ubicación: tras la pantalla (...)
Contactar:

Re: crear una carpeta en multiples directorios

Mensaje por niky45 » Sab Ago 04, 2012 10:25 pm

Código: Seleccionar todo

find -type d -exec mkdir -p "{}/ALGO/" \;
ni idea de si funciona, asi que te toca probarlo.

PD: mas info: man find ; teoricamente SI que deberia ser capaz de hacerlo.
#446716
>>"Linux: the operating system with a CLUE... Command Line User Environment".
(seen in a posting in comp.software.testing)

[ DNFD ] - [ F4A ] - [ dotfiles ]
Avatar de Usuario
tuxman
Forista Distinguido
Forista Distinguido
Mensajes: 1026
Registrado: Lun Feb 26, 2007 8:00 am
Ubicación: Guadalajara, Jalisco. Mexico
Contactar:

Re: crear una carpeta en multiples directorios- script bash

Mensaje por tuxman » Sab Ago 04, 2012 10:32 pm

Bien, he realizado un pequeño script Bash que hace algo parecido a lo que creo que buscas.

El script son las siguientes lineas de código:

Código: Seleccionar todo

#!/bin/bash

find ~/test/ -type d |
while read carpeta
do
   echo "Carpeta: ${carpeta}"
   nueva_carpeta=${carpeta}/chafita/
   mkdir "${nueva_carpeta}"
done
Ahora: ¿Que hace? Esto es lo que hace, linea a linea:

#!/bin/bash -> Esta linea es llamada Shebang (espero escribirlo bien), sirve, entre otras cosas, para poder indicarle al sistema Linux qué programa debe de interpretar y ejecutar el contenido del script. En este caso, Bash.

find ~/test/ -type d | -> Esta es una llamada simple a find. Le estoy diciendo que, del Home del usuario (la "nubesita de la eñe" (nunca me acuerdo como se llama ¬¬), lo cual es el caracter '~'), en la carpeta que debe de existir y se llama "test", busque carpetas. Algunas las he creado con espacios en los nombres y parece funcionar. En este caso, por ejemplo en mi caso, el elemento "~/test/" se expandiría automaticamente a "/home/moises/test/". Si la carpeta que ocupas procesar es fija, puedes poner la dirección exacta o buscar otros medios (ya serían temas diferentes) para indicarle a tu script qué carpeta usar. Ahora, verás que hay una barra vertical al final de la linea. Es conocido como "pipe" o un "OR" (si sabes programar en C, sabes a que me refiero). De momento solo necesitas saber que es para que lo que find vaya imprimiendo, Bash se lo mande al comando que está a la derecha... que en el caso del script, está en la siguiente linea, el cual es el while.

while read carpeta -> Esta linea es el inicio de un ciclo while (en Bash puedes programar cosas bastante elaboradas), el cual se ejecutará mientras que su condicional, un comando, no falle. El comando que ejecuta y es su condicional, es un read. Read lee desde una entrada entandar, o, en este caso, estará leyendo lo que find haya impreso y almacenará lo leído en la variable "carpeta". En este caso, al ser un ciclo, en cada vuelta read leerá una dirección diferente de las que find imprima.

echo "Carpeta: ${carpeta}" -> Esta linea (omito el do y el done porque son parte del while) simplemente imprimirá en la terminal la carpeta que se ha leído de find. Si no conoces Bash, esta es la manera de imprimir valores de una variable, colocas un símbolo de pesos y, entre llaves (se pueden omitir en esta linea, pero en la siguiente si se ocupan, por lo que, por sencillez, siempre úsalas). Si no quieres que se impriman los mensajes, simplemente borra esta linea.

nueva_carpeta=${carpeta}/chafita/ -> Esta linea te permite crear una nueva variable (llamada en mi caso "nueva_carpeta"), teniendo como contenido la dirección de "carpeta" y, concatenado, el nombre de la carpeta que quieres crear en cada una. Pongo la diagonal antes del nombre a concatenar ya que find imprime las direcciones sin diagonal final.

mkdir "${nueva_carpeta}" -> Finalmente, se le pide a mkdir que cree la carpeta que quieres. Pongo el valor de la variable entre comillas para que la dirección le llegue completa a mkdir. Si tu direccion a crear es /home/pepe/carpeta/, no hay problema si no tiene comillas, pero si es "/home/pepe/mi carpeta con/muchos espacio/", sin las comillas, mkdir tomará cada parte de la ruta como una opción diferente, indicandote errores como "No se puede crear /home/pepe/mi, no se reconoce opción carpeta, no se reconoce opción con/muchos, ...", por lo que mejor siempre pon toda la ruta con comillas.

Este código deberías de pegarlo en un archivo de texto plano llamado algo como "script.sh" o como quieras llamarlo. Abrelo con tu editor favorito de texto y pega el código, salva y cierra, y mediante comando ejecutalo.

Para ejecutarlo usa algo como:

Código: Seleccionar todo

$ ./script.sh
Nota: El simbolo de pesos no es parte del comando. Si te dice algun error de que no se puede ejecutar, antes del comando anterior, ocuparias ejecutar este otro (una sola vez, no cada vez que ejecutes el script):

Código: Seleccionar todo

$ chmod +x script.sh
Espero que te ayude mi solución.

Saludos.
Edita los nombres de tus post con "[SOLUCIONADO]" cuando encuentres una solución a tu problema.

Lenovo G470
Intel Core i3 2.1 GHz (2310M)
Chakra Linux.
Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

Re: crear una carpeta en multiples directorios- script bash

Mensaje por akodo » Dom Ago 05, 2012 12:30 am

Me quedo con el código de Niky45.
Descargue el gestor de mp3 "Music Manager" -> ([url=http://ctrlalt.iespana.es]mmlf[/url])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])
Avatar de Usuario
tuxman
Forista Distinguido
Forista Distinguido
Mensajes: 1026
Registrado: Lun Feb 26, 2007 8:00 am
Ubicación: Guadalajara, Jalisco. Mexico
Contactar:

Re: crear una carpeta en multiples directorios- script bash

Mensaje por tuxman » Dom Ago 05, 2012 12:48 am

Bueno Akodo, ya solo queda que es175ed elija XD.
Edita los nombres de tus post con "[SOLUCIONADO]" cuando encuentres una solución a tu problema.

Lenovo G470
Intel Core i3 2.1 GHz (2310M)
Chakra Linux.
Avatar de Usuario
niky45
Forista Ancestral
Forista Ancestral
Mensajes: 9186
Registrado: Jue Abr 12, 2007 7:00 am
Ubicación: tras la pantalla (...)
Contactar:

Re: crear una carpeta en multiples directorios- script bash

Mensaje por niky45 » Dom Ago 05, 2012 10:27 am

(semi-offtopic) tuxman, tienes scriptitis. :D digo, todos le hemos buscado tres pies al gato, y no me cabe duda de que tu script funciona (cosa que no puedo asegurar de mi llamada a find, ya que no la he probado ), y ademas, te lo has pasado bien (programar es divertido), y has practicado bash.

sin embargo... y aunque yo haya hecho muchas veces lo mismo que tu, pienso que cuando con una simple llamada a un comando con unas opciones X, se soluciona, un problema... es mejor leerse el man que coger la burra a bash y tirar p'alante.

si, yo soy la primera que ha hecho scripts para lo inimaginable (si solo vierais mi bashrc....), solo para despues leer el man de algun copmando y pensar "acabo de perder una tarde de mi vida". pero en fin, asi es la vida. :wink:

y aun asi: gracias por tu script. las pipes y yo seguimos sin acabar de comprendernos, y bueno, siempre se aprende. :wink:
#446716
>>"Linux: the operating system with a CLUE... Command Line User Environment".
(seen in a posting in comp.software.testing)

[ DNFD ] - [ F4A ] - [ dotfiles ]
Avatar de Usuario
tuxman
Forista Distinguido
Forista Distinguido
Mensajes: 1026
Registrado: Lun Feb 26, 2007 8:00 am
Ubicación: Guadalajara, Jalisco. Mexico
Contactar:

Re: crear una carpeta en multiples directorios- script bash

Mensaje por tuxman » Dom Ago 05, 2012 8:40 pm

Ciertamente Niky45, dependiendo de la situación, es posible que sea mejor emplear un comando directo, pero, a personas como yo, la memoria nos traiciona muy seguido, por lo que en mi caso, usualmente hago scripts no porque los considere mas útiles que los comandos directos, sino porque usualmente olvido los comandos ¬¬, por lo que prefiero tenerlos a la mano en scripts :D
Edita los nombres de tus post con "[SOLUCIONADO]" cuando encuentres una solución a tu problema.

Lenovo G470
Intel Core i3 2.1 GHz (2310M)
Chakra Linux.
Avatar de Usuario
neurus
Forista Legendario
Forista Legendario
Mensajes: 1801
Registrado: Dom Oct 10, 2004 7:00 am

Re: crear una carpeta en multiples directorios- script bash

Mensaje por neurus » Dom Ago 05, 2012 8:52 pm

...porque usualmente olvido los comandos ...
Cuando te sientas a ver televisión con los demás abuelos del geriátrico, ¿no hay un señor de malas trazas con un termo y un mate? Si lo ves, salúdalo de mi parte. Es mcun.
Avatar de Usuario
tuxman
Forista Distinguido
Forista Distinguido
Mensajes: 1026
Registrado: Lun Feb 26, 2007 8:00 am
Ubicación: Guadalajara, Jalisco. Mexico
Contactar:

Re: crear una carpeta en multiples directorios- script bash

Mensaje por tuxman » Dom Ago 05, 2012 8:58 pm

La senilidad nos atormenta Neurus... a pesar de no estar tan viejos (tengo 24 ¬.¬), espero que a es175ed no le pase eso ~.~, aunque por tu comentario y referencias... parece que mas de uno por aquí ya andamos en esas...
Edita los nombres de tus post con "[SOLUCIONADO]" cuando encuentres una solución a tu problema.

Lenovo G470
Intel Core i3 2.1 GHz (2310M)
Chakra Linux.
Avatar de Usuario
mcun
Administrador
Administrador
Mensajes: 3888
Registrado: Lun Abr 19, 2010 12:30 am
Ubicación: En una de las nalgas del culo del mundo (según la Bersuit Vergarabat)
Contactar:

Re: crear una carpeta en multiples directorios- script bash

Mensaje por mcun » Dom Ago 05, 2012 9:15 pm

ya te veremos por aquí neurus a todos nos llega, sino mira a yoyo meta quejarse de que las cosas no son como antes...
Los programadores de verdad no documentan. La documentación es para los idiotas que no pueden leer un volcado de memoria.

Trusted Network and Developer | Lee el Reglamento !! |WIKI-EL | Twitter @mr_mcun
Debian + TTY | ArchLinux + awesome | openSUSE + Gnome-Shell | Linux User #508809
es175ed
Forista Nuevo
Forista Nuevo
Mensajes: 10
Registrado: Sab Ago 04, 2012 8:06 pm

Re: crear una carpeta en multiples directorios- script bash Solucionado y agradecido.

Mensaje por es175ed » Dom Ago 05, 2012 10:53 pm

Ante todo darle las gracias a tuxman.
No me importa si funciona o no.
Lo que mas me ha gustado es su aptitud.
Cunado una respuesta viene acompañada de una explicacion tan concisa es una oportunidad para aprender.
Muchas gracias.
Espero para el bien comun que todos tomemos ejemplo.
Y que en un futuro yo pueda hacer lo mismo por otro.
Gracias
Avatar de Usuario
niky45
Forista Ancestral
Forista Ancestral
Mensajes: 9186
Registrado: Jue Abr 12, 2007 7:00 am
Ubicación: tras la pantalla (...)
Contactar:

Re: crear una carpeta en multiples directorios- script bash

Mensaje por niky45 » Lun Ago 06, 2012 1:29 pm

a mi lo que me pasa es que no me acuerdo de la cantidad de aliases y funciones que tengo. :? me resulta mas practico el man. ;)

(offtopic) @es175ed: permiteme un consejo: vale mas que te ensenien a pescar, que que te den unos peces. y lo siento, pero decir que le eches un ojo al man, sigo pensando que es el mejor consejo que puedo darte. por experiencia. :wink:
#446716
>>"Linux: the operating system with a CLUE... Command Line User Environment".
(seen in a posting in comp.software.testing)

[ DNFD ] - [ F4A ] - [ dotfiles ]
es175ed
Forista Nuevo
Forista Nuevo
Mensajes: 10
Registrado: Sab Ago 04, 2012 8:06 pm

Re: crear una carpeta en multiples directorios- script bash

Mensaje por es175ed » Mar Ago 07, 2012 3:24 pm

Hola de nuevo.
Hoy he tenido tiempo de probar el script.
Solo he tenido que hacerle un cambio.

nueva_carpeta="${carpeta}/chafita/"

Sin el entrecomillado me creaba una subcarpeta chafita dentro de chafita. Por lo demas perfecto.
Solo cambiarle la ruta y el nombre de la carpeta a crear. Eso ya lo hara mi amigo.

El comando que aporto niky45 no me funciono exactamente como deseaba.
Gracias de todas formas.

El comodin "~" se llama tilde.

Estoy aprendiwendo a usar el shell, pero me queda mucho.

Muchas gracias por vuestras respuestas, a todos.

Un saludo
Responder
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje