crear una carpeta en multiples directorios- script bash - SOLUCIONADO -
crear una carpeta en multiples directorios- script bash - SOLUCIONADO -
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.
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.
- tuxman
- 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
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.
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.
Lenovo G470
Intel Core i3 2.1 GHz (2310M)
Chakra Linux.
Re: crear una carpeta en multiples directorios
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
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
- niky45
- 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
Código: Seleccionar todo
find -type d -exec mkdir -p "{}/ALGO/" \;
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 ]
>>"Linux: the operating system with a CLUE... Command Line User Environment".
(seen in a posting in comp.software.testing)
[ DNFD ] - [ F4A ] - [ dotfiles ]
- tuxman
- 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
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:
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:
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):
Espero que te ayude mi solución.
Saludos.
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
#!/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
Código: Seleccionar todo
$ chmod +x script.sh
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.
Lenovo G470
Intel Core i3 2.1 GHz (2310M)
Chakra Linux.
- akodo
- 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
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])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])
- tuxman
- 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
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.
Lenovo G470
Intel Core i3 2.1 GHz (2310M)
Chakra Linux.
- niky45
- 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
(semi-offtopic) tuxman, tienes scriptitis.
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 cogerla 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.
y aun asi: gracias por tu script. las pipes y yo seguimos sin acabar de comprendernos, y bueno, siempre se aprende.

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
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.

y aun asi: gracias por tu script. las pipes y yo seguimos sin acabar de comprendernos, y bueno, siempre se aprende.

#446716
>>"Linux: the operating system with a CLUE... Command Line User Environment".
(seen in a posting in comp.software.testing)
[ DNFD ] - [ F4A ] - [ dotfiles ]
>>"Linux: the operating system with a CLUE... Command Line User Environment".
(seen in a posting in comp.software.testing)
[ DNFD ] - [ F4A ] - [ dotfiles ]
- tuxman
- 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
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 

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.
Lenovo G470
Intel Core i3 2.1 GHz (2310M)
Chakra Linux.
Re: crear una carpeta en multiples directorios- script bash
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....porque usualmente olvido los comandos ...
- tuxman
- 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
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.
Lenovo G470
Intel Core i3 2.1 GHz (2310M)
Chakra Linux.
- mcun
- 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
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
Trusted Network and Developer | Lee el Reglamento !! |WIKI-EL | Twitter @mr_mcun
Debian + TTY | ArchLinux + awesome | openSUSE + Gnome-Shell | Linux User #508809
Re: crear una carpeta en multiples directorios- script bash Solucionado y agradecido.
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
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
- niky45
- 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
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.


(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.

#446716
>>"Linux: the operating system with a CLUE... Command Line User Environment".
(seen in a posting in comp.software.testing)
[ DNFD ] - [ F4A ] - [ dotfiles ]
>>"Linux: the operating system with a CLUE... Command Line User Environment".
(seen in a posting in comp.software.testing)
[ DNFD ] - [ F4A ] - [ dotfiles ]
Re: crear una carpeta en multiples directorios- script bash
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
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
-
- Temas similares
- Respuestas
- Vistas
- Último mensaje
-
- 10 Respuestas
- 2574 Vistas
-
Último mensaje por nestoriano
-
- 5 Respuestas
- 1543 Vistas
-
Último mensaje por ramonovski
-
- 9 Respuestas
- 2140 Vistas
-
Último mensaje por hipersayan_x
-
- 4 Respuestas
- 1728 Vistas
-
Último mensaje por greer
-
- 10 Respuestas
- 1935 Vistas
-
Último mensaje por niky45