| Autor |
Mensaje |
Bodegas

Forista Nuevo
Registrado: Lun Mar 28, 2011 2:32 am Mensajes: 4
|
 Publicado: Lun Mar 28, 2011 2:35 am |
|
Estoy intentando hacer algo muy simple pero como siempre me estoy liando mucho  Lo que quiero hacer es meter en una variable la lista de ficheros pdf de un directorio para después pasar esa lista de ficheros como parámetros a un programa. Lo que hice fue: unset todo; for i in `ls *.pdf`; do todo=$todo" "\"$i\"; done programa $todo; Lo que hago es ir concatenando todos los nombres de ficheros e insertar comillas dobles al principio y al final de cada nombre. Esto lo hago por si hay algún fichero que tenga espacios en blanco o paréntesis en el nombre. El resultado es que no funciona. La cadena se crea bien. Si se hace un echo $todo aparecen todos los nombre correctamente entrecomillados y separados por un espacio pero al pasárselo al programa, no los reconoce como nombre de ficheros. Da la impresión de que el programa interpreta las " como si fuesen parte del nombre... Alguna idea?
Última edición por Bodegas el Vie Abr 01, 2011 1:11 am, editado 1 vez en total
|
|
|
|
 |
dracel

Forista Mayor
Registrado: Vie Jun 06, 2008 11:00 pm Mensajes: 627 Ubicación: España/Galicia/Pontevedra/Baiona/Sabaris
|
 Publicado: Lun Mar 28, 2011 6:42 am |
|
|
No se por que necesitas concatenar yo haría simplemente: programa $todo *.pdf
*.pdf se debería expandir por todos los archivos acabados por .pdf, así que no es necesario andar con ningún bucle
_________________ como hacer preguntas inteligentes
Sean tan amables de poner la etiqueta de (SOLUCIONADO) cuando consigan solucionar su problema
|
|
|
|
 |
niky45

Forista Ancestral
Registrado: Mié Abr 11, 2007 11:00 pm Mensajes: 8550 Ubicación: tras la pantalla (...)
|
 Publicado: Lun Mar 28, 2011 8:58 am |
|
si la cadena se crea bien, sera cuestion de pasarsela de otra manera al programa.... prueba con esto: Código: programa $(echo $todo) ; por cierto, ese unset del principio sobra. (quiero decir... esta de adorno. $todo NO va a estar definida. y si sospechas que puede estarlo, ponle un nombre que no deba estarlo. ). me refiero... la unica manera de que lo este, es que tengas una variable $todo en el bashrc o similares. por lo de que si has ejecutado previamente el script, no te preocupes. las variables son locales. PD: busca info sobre arrays (en bash). bash tiene muchisima potencia trabajando con arrays, y a lo mejor te simplifica un poco las cosas. (en realidad una variable de por si es un array, pero a la hora de trabajar, si utilizas la sintaxis de los arrays, puede que te resulte mas sencillo.) la pena es que no tengo ninguna guia a mano... la idea es pasarle a tu programa algo asi: Código: programa ${todo[*]} ; este es el primer link que he visto http://tldp.org/LDP/abs/html/arrays.html
_________________ #446716
--Not me, guys. I read the Bash man page each day like a Jehovah's Witness reads the Bible. No wait, the Bash man page IS the bible. Excuse me... (from comp.os.linux.misc) [ DNFD ] - [ F4A ] - [ dotfiles ]
|
|
|
|
 |
Bodegas

Forista Nuevo
Registrado: Lun Mar 28, 2011 2:32 am Mensajes: 4
|
 Publicado: Mar Mar 29, 2011 5:28 am |
|
Muchas gracias por las contestaciones. Lo acabo de solucionar de la forma más fácil, con un simple *.pdf como dice dracel. A veces me complico demasiado  niky45, probé con esto programa $(echo $todos) ; pero no funciona. Gracias por el link de los arrays, le echaré un vistazo Editado -- Mar Mar 29, 2011 5:28 am --Pero ahora me surge otra duda. ¿Cómo puedo pasar un argumento que incluya comillas a un programa? Porque está claro que escapando las comillas no funciona. Por ejemplo, si quiero hacer un script que me busque un fichero: En la linea de comandos haría un find / -xdev -name '*palabra*' ¿pero en un script? find / -xdev -name '*$1*'; ¿Cómo escapo las comillas simples para que me las reconozca como comillas?
|
|
|
|
 |
dracel

Forista Mayor
Registrado: Vie Jun 06, 2008 11:00 pm Mensajes: 627 Ubicación: España/Galicia/Pontevedra/Baiona/Sabaris
|
 Publicado: Mar Mar 29, 2011 9:11 am |
|
Creo que no comprendes como hace las expansiones bash Ejecuta estos comandos y observa como se comporta Código: echo * echo "*" Viendo esto te darás cuenta de que bastara con que ejecutes Código: find -xdev -name "$1" Y para que lo coja bien al ejecutar el programa pongas como entrada "*palabra*" Espero haberme explicado bien, ya que no me resulta fácil
_________________ como hacer preguntas inteligentes
Sean tan amables de poner la etiqueta de (SOLUCIONADO) cuando consigan solucionar su problema
|
|
|
|
 |
Bodegas

Forista Nuevo
Registrado: Lun Mar 28, 2011 2:32 am Mensajes: 4
|
 Publicado: Vie Abr 01, 2011 1:10 am |
|
|
No, si mi problema no está en los *. El problema está en los caracteres especiales y la necesidad de entrecomillar los nombres de archivos por si acaso. Entiendo tu idea, pasar las comillas en el propio argumento. Así funciona, sí. Pero sigo sin saber como pasar un argumento con comillas a un comando de linux.
|
|
|
|
 |
niky45

Forista Ancestral
Registrado: Mié Abr 11, 2007 11:00 pm Mensajes: 8550 Ubicación: tras la pantalla (...)
|
 Publicado: Vie Abr 01, 2011 4:30 am |
|
asi?? programa '"mi argumento"' auqnue se supone, que simplemente escapandolas deberia funcionar.... programa "\"mi argumento\""
_________________ #446716
--Not me, guys. I read the Bash man page each day like a Jehovah's Witness reads the Bible. No wait, the Bash man page IS the bible. Excuse me... (from comp.os.linux.misc) [ DNFD ] - [ F4A ] - [ dotfiles ]
|
|
|
|
 |
Bodegas

Forista Nuevo
Registrado: Lun Mar 28, 2011 2:32 am Mensajes: 4
|
 Publicado: Lun Abr 04, 2011 1:49 pm |
|
|
No, así no funciona. Pruébalo con un simple find. find /home -name "\"algo\""
no te va a encontrar nada porque yo creo que interpreta las comillas como texto.
Y así tampoco programa '"mi argumento"'
|
|
|
|
 |
niky45

Forista Ancestral
Registrado: Mié Abr 11, 2007 11:00 pm Mensajes: 8550 Ubicación: tras la pantalla (...)
|
 Publicado: Mar Abr 05, 2011 11:59 am |
|
Citar: [19:56:53] - [niky@ian:~] >>> find /home -name "\"proc\""
[19:57:02] - [niky@ian:~] >>> find /home -name "proc"
[19:57:07] - [niky@ian:~] >>> lsg proc Grepping for files matching proc... proc_diskstats.log proc_ps.log proc_stat.log
[19:57:12] - [niky@ian:~] >>> no, con find no funciona. pero porque tampoco funciona si se lo paso con comillas sin mas... el tema es... tu "problema" es que tienes un programa al que le quieres pasar un nombre de archivo con espacios, no??? Código: [19:59:19] - [niky@ian:~] >>> cp "proc_stat.log" /tmp/ -v `proc_stat.log' -> `/tmp/proc_stat.log'
[19:59:25] - [niky@ian:~] >>> cp "\"proc_stat.log"\" /tmp/ -v cp: cannot stat `"proc_stat.log"': No such file or directory
[19:59:31] - [niky@ian:~] >>> cp "\"proc_stat.log\"" /tmp/ -v cp: cannot stat `"proc_stat.log"': No such file or directory
[19:59:54] - [niky@ian:~] >>>
ciertamente, esta interpretando como que las comillas son parte del argumento. que por que?? ni idea. tal vez en el man de bash venga algo. deberias echarle un ojo. 
_________________ #446716
--Not me, guys. I read the Bash man page each day like a Jehovah's Witness reads the Bible. No wait, the Bash man page IS the bible. Excuse me... (from comp.os.linux.misc) [ DNFD ] - [ F4A ] - [ dotfiles ]
|
|
|
|
 |
hipersayan_x

Forista Distinguido
Registrado: Jue Abr 26, 2007 11:00 pm Mensajes: 1426
|
 Publicado: Mar Abr 05, 2011 1:50 pm |
|
Muy interesante, se me ocurre que podrías intentar usando listas: Código: argumentos=$( "archivo 1.pdf" "archivo 2.pdf" "archivo 3.pdf" ) programa ${argumentos[@]}
_________________ "Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit."
"Finibus Bonorum Et Malorum", Cicerón
|
|
|
|
 |
|
|
|