Reglamento general de los foros   •   FAQ   •   Buscar en el foro •  Registrarse | Iniciar sesión 



Portada » Foros Linux » Desarrollo » Programación


Nuevo tema Responder al tema
 [ 15 mensajes ] 
Patrocinadores

Autor
Buscar:
Mensaje

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Sab Ago 04, 2012 8:06 pm
Mensajes: 10

Nota Publicado: Sab Ago 04, 2012 8:11 pm 
Arriba  
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
 Perfil  

Desconectado
Forista Distinguido
Forista Distinguido
Avatar de Usuario

Registrado: Lun Feb 26, 2007 8:00 am
Mensajes: 1026
Ubicación: Guadalajara, Jalisco. Mexico

Nota Publicado: Sab Ago 04, 2012 8:42 pm 
Arriba  
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.

 Perfil WWW  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Sab Ago 04, 2012 8:06 pm
Mensajes: 10

Nota Publicado: Sab Ago 04, 2012 9:57 pm 
Arriba  
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

 Perfil  

Desconectado
Forista Ancestral
Forista Ancestral
Avatar de Usuario

Registrado: Jue Abr 12, 2007 7:00 am
Mensajes: 9186
Ubicación: tras la pantalla (...)

Nota Publicado: Sab Ago 04, 2012 10:25 pm 
Arriba  
Código:
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 ]

 Perfil WWW  

Desconectado
Forista Distinguido
Forista Distinguido
Avatar de Usuario

Registrado: Lun Feb 26, 2007 8:00 am
Mensajes: 1026
Ubicación: Guadalajara, Jalisco. Mexico

Nota Publicado: Sab Ago 04, 2012 10:32 pm 
Arriba  
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:
#!/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:
$ ./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:
$ 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.

 Perfil WWW  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Mié Nov 28, 2007 8:00 am
Mensajes: 1457
Ubicación: En la X del explorer (pulse para llamar)

Nota Publicado: Dom Ago 05, 2012 12:30 am 
Arriba  
Me quedo con el código de Niky45.

_________________
Descargue el gestor de mp3 "Music Manager" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)

 Perfil  

Desconectado
Forista Distinguido
Forista Distinguido
Avatar de Usuario

Registrado: Lun Feb 26, 2007 8:00 am
Mensajes: 1026
Ubicación: Guadalajara, Jalisco. Mexico

Nota Publicado: Dom Ago 05, 2012 12:48 am 
Arriba  
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.

 Perfil WWW  

Desconectado
Forista Ancestral
Forista Ancestral
Avatar de Usuario

Registrado: Jue Abr 12, 2007 7:00 am
Mensajes: 9186
Ubicación: tras la pantalla (...)

Nota Publicado: Dom Ago 05, 2012 10:27 am 
Arriba  
(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 ]

 Perfil WWW  

Desconectado
Forista Distinguido
Forista Distinguido
Avatar de Usuario

Registrado: Lun Feb 26, 2007 8:00 am
Mensajes: 1026
Ubicación: Guadalajara, Jalisco. Mexico

Nota Publicado: Dom Ago 05, 2012 8:40 pm 
Arriba  
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.

 Perfil WWW  

Desconectado
Forista Legendario
Forista Legendario
Avatar de Usuario

Registrado: Dom Oct 10, 2004 7:00 am
Mensajes: 1799

Nota Publicado: Dom Ago 05, 2012 8:52 pm 
Arriba  
Citar:
...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.

 Perfil  

Desconectado
Forista Distinguido
Forista Distinguido
Avatar de Usuario

Registrado: Lun Feb 26, 2007 8:00 am
Mensajes: 1026
Ubicación: Guadalajara, Jalisco. Mexico

Nota Publicado: Dom Ago 05, 2012 8:58 pm 
Arriba  
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.

 Perfil WWW  

Desconectado
Administrador
Administrador
Avatar de Usuario

Registrado: Lun Abr 19, 2010 12:30 am
Mensajes: 3888
Ubicación: En una de las nalgas del culo del mundo (según la Bersuit Vergarabat)

Nota Publicado: Dom Ago 05, 2012 9:15 pm 
Arriba  
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

 Perfil WWW  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Sab Ago 04, 2012 8:06 pm
Mensajes: 10

Nota Publicado: Dom Ago 05, 2012 10:53 pm 
Arriba  
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

 Perfil  

Desconectado
Forista Ancestral
Forista Ancestral
Avatar de Usuario

Registrado: Jue Abr 12, 2007 7:00 am
Mensajes: 9186
Ubicación: tras la pantalla (...)

Nota Publicado: Lun Ago 06, 2012 1:29 pm 
Arriba  
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 ]

 Perfil WWW  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Sab Ago 04, 2012 8:06 pm
Mensajes: 10

Nota Publicado: Mar Ago 07, 2012 3:24 pm 
Arriba  
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

 Perfil  
Mostrar mensajes previos:  Ordenar por  
 [ 15 mensajes ] 
Nuevo tema Responder al tema

Saltar a:  


 Temas relacionados   Autor   Respuestas   Vistas   Último mensaje 
Ejecutar comando sobre múltiples ficheros en directorios distintos con mismo nombre

en Sistema

psk

3

1063

Vie May 21, 2010 2:09 pm

shicefgo Ver último mensaje

Crear un ejecutable en bash [SOLUCIONADO]

en Sistema

nestoriano

10

2407

Jue Jul 12, 2012 2:49 am

nestoriano Ver último mensaje

Duda bash script (SOLUCIONADO)

en Programación

Bodegas

9

1943

Mar Abr 05, 2011 9:50 pm

hipersayan_x Ver último mensaje

Ayuda con script en bash [Solucionado]

en Programación

ramonovski

5

1231

Jue Feb 16, 2012 7:35 am

ramonovski Ver último mensaje

Problema con este script en bash [SOLUCIONADO]

en Programación

elmohino

10

1682

Vie Feb 18, 2011 1:13 am

niky45 Ver último mensaje



¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group :: Style based on FI Subice by phpBBservice.nl :: Todos los horarios son UTC + 1 hora [ DST ]
Traducción al español por Huan Manwë
phpBB SEO