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



Foros Linux » Desarrollo » Programación


Nuevo tema Responder al tema
 [ 3 mensajes ] 
Patrocinadores

Autor
Buscar:
Mensaje

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Sab Dic 18, 2010 5:14 pm
Mensajes: 1

Nota Publicado: Sab Dic 18, 2010 6:11 pm 
Arriba  
hola!
primero que nada, espero estar en el foro correcto, ya que mi pregunta es sobre shell scripting, no sobre alguno de los lenguajes que se mencionan en la descripción del foro (python, pearl...). Si esta pregunta debería hacerse en otro foro, por favor háganmelo saber.

mi duda es la siguiente. estaba escribiendo un script en el que necesitaba iterar sobre la lista de archivos del directorio actual para realizar ciertas modificaciones en los nombres de los archivos. en un principio intente lo siguiente:

for i in $(ls)

y funcionaba bien, el problema era cuando el directorio incluía algún nombre de archivo que usara algún espacio en blanco. en vez de iterar sobre cada uno de los nombres de los archivos, iteraba sobre cada palabra (cada cadena de caracteres separada por un espacio en blanco o un salto de linea)

para ejemplificar:
no iteraba sobre una lista de archivos
supongamos que estos son los archivos de mi directorio actual:
archivo uno.txt
archivo dos.txt
archivo tres.txt

al ejecutar el siguiente script...
for i in $(ls)
do
echo "$i"
done

obtenía lo siguiente:
archivo
uno.txt
archivo
dos.txt
archivo
tres.txt

la cuestión es que después de probar muchas posibles soluciones, un error de tipeo me llevo a escribir el cuerpo del for de la siguiente manera:

for i in *

milagrosamente el script funcionó exactamente como yo quería. ya no me separaba los nombres de los archivos ante un espacio en blanco, sino que la variable i iteraba por cada uno de los nombres de los archivos en el directorio.

para ejemplificar, si ejecutamos el siguiente script en el directorio que use como ejemplo anteriormente...

for i in *
do
echo $i
done

obtenemos lo siguiente:
archivo uno.txt
archivo dos.txt
archivo tres.txt

me sorprende mucho este comportamiento del asterisco que descubrí de casualidad. he buscado en internet sobre el uso de este símbolo en bash, pero solo encontré referencias a su uso como comodín en una búsqueda (con el comando find por ejemplo), pero nada sobre que podia ser usado en un for in como reemplazo de ls.

alguien sabe algo más acerca de esto? probablemente existan varios usos útiles del asterisco en bash que no conocemos.

bueno, espero no haberme extendido demasiado y que me puedan dar mas información sobre este asunto.
desde ya muchas gracias. saludos!

 Perfil Email  

Desconectado
Forista Distinguido
Forista Distinguido
Avatar de Usuario

Registrado: Sab Oct 09, 2004 11:00 pm
Mensajes: 1299

Nota Publicado: Sab Dic 18, 2010 8:00 pm 
Arriba  
Es que ambos usos, son el mismo. En ese bucle, el asterisco es un comodín.

La traducción a pseudocódigo de ese bucle sería: para [todos los archivos en este directorio] guardarlos en la variable i. Los corchetes encierran el sentido del asterisco.

Es lo mismo que hacer for i in `ls *`. Sigues usando un comodín. No hay otro uso. La gracia de un comodín, es que puedes usarlo en contextos muy diferentes, o no sería comodín. Y es un comodín universal, además. Funciona en todos los sistemas operativos que conozco.

 Perfil  

Desconectado
Forista Mayor
Forista Mayor

Registrado: Vie Ago 24, 2007 11:00 pm
Mensajes: 794
Ubicación: Galicia - España

Nota Publicado: Dom Dic 19, 2010 4:49 am 
Arriba  
Digamos que el * es un parámetro que en tiempo de ejecución es substituido por todos los ficheros existentes en el directorio actual ( o que coincidan con la expresión que estemos usando). Es decir si dentro de un directorio tengo los ficheros
Código:
fich1
fich2
foo


El ejecutar
Código:
ls *
es lo mismo que ejecutar
Código:
ls fich1 fich2 foo
Y ejecutar ls fo* es lo mismo que ejecutar ls foo. Los bueno del * es que realiza la expansión escapando los nombres de los archivos. Es decir que lo que se ejecuta en realidad es ls "fich1" "fich2" "foo". Cuando los archivos van entre comillas, aunque tengan espacios, la shell es capaz de tratarlos adecuadamente.

_________________
Mi blog: Conocimiento Abierto

 Perfil WWW  
Mostrar mensajes previos:  Ordenar por  
 [ 3 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 4 invitados

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