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



Foros Linux » Desarrollo » Programación


Nuevo tema Responder al tema
 [ 10 mensajes ] 
Patrocinadores

Autor
Buscar:
Mensaje

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Lun Mar 28, 2011 2:32 am
Mensajes: 4

Nota Publicado: Lun Mar 28, 2011 2:35 am 
Arriba  
Estoy intentando hacer algo muy simple pero como siempre me estoy liando mucho :D

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
 Perfil Email  

Desconectado
Forista Mayor
Forista Mayor
Avatar de Usuario

Registrado: Vie Jun 06, 2008 11:00 pm
Mensajes: 627
Ubicación: España/Galicia/Pontevedra/Baiona/Sabaris

Nota Publicado: Lun Mar 28, 2011 6:42 am 
Arriba  
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

 Perfil  

Desconectado
Forista Ancestral
Forista Ancestral
Avatar de Usuario

Registrado: Mié Abr 11, 2007 11:00 pm
Mensajes: 8550
Ubicación: tras la pantalla (...)

Nota Publicado: Lun Mar 28, 2011 8:58 am 
Arriba  
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 :P 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 ]

 Perfil Email WWW  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Lun Mar 28, 2011 2:32 am
Mensajes: 4

Nota Publicado: Mar Mar 29, 2011 5:28 am 
Arriba  
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 :D

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?

 Perfil Email  

Desconectado
Forista Mayor
Forista Mayor
Avatar de Usuario

Registrado: Vie Jun 06, 2008 11:00 pm
Mensajes: 627
Ubicación: España/Galicia/Pontevedra/Baiona/Sabaris

Nota Publicado: Mar Mar 29, 2011 9:11 am 
Arriba  
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

 Perfil  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Lun Mar 28, 2011 2:32 am
Mensajes: 4

Nota Publicado: Vie Abr 01, 2011 1:10 am 
Arriba  
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.

 Perfil Email  

Desconectado
Forista Ancestral
Forista Ancestral
Avatar de Usuario

Registrado: Mié Abr 11, 2007 11:00 pm
Mensajes: 8550
Ubicación: tras la pantalla (...)

Nota Publicado: Vie Abr 01, 2011 4:30 am 
Arriba  
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 ]

 Perfil Email WWW  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Lun Mar 28, 2011 2:32 am
Mensajes: 4

Nota Publicado: Lun Abr 04, 2011 1:49 pm 
Arriba  
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"'

 Perfil Email  

Desconectado
Forista Ancestral
Forista Ancestral
Avatar de Usuario

Registrado: Mié Abr 11, 2007 11:00 pm
Mensajes: 8550
Ubicación: tras la pantalla (...)

Nota Publicado: Mar Abr 05, 2011 11:59 am 
Arriba  
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 ]

 Perfil Email WWW  

Desconectado
Forista Distinguido
Forista Distinguido
Avatar de Usuario

Registrado: Jue Abr 26, 2007 11:00 pm
Mensajes: 1426

Nota Publicado: Mar Abr 05, 2011 1:50 pm 
Arriba  
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

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

Saltar a:  


¿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 - 6 horas
Traducción al español por Huan Manwë
phpBB SEO