¿Cómo listo un determinado rango de archivos con ls? [SOLUCIONADO]

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: akodo, maiku

Responder
Avatar de Usuario
elmohino
Forista Menor
Forista Menor
Mensajes: 95
Registrado: Lun Oct 20, 2008 7:00 am

¿Cómo listo un determinado rango de archivos con ls? [SOLUCIONADO]

Mensaje por elmohino » Mar Sep 18, 2012 7:18 pm

Hola, buenas tardes.

En un directorio en el que tengo multitud de archivos ordenados numéricamente (*.001, *.002, etc.) quisiera poder listar solamente un determinado rango de ellos (p.e., desde el [nombre_base].015 hasta el [nombre_base].047) sin tener que escribirlos todos.

Muchas gracias.
Última edición por elmohino el Mar Sep 18, 2012 10:59 pm, editado 1 vez en total.
Avatar de Usuario
niky45
Forista Ancestral
Forista Ancestral
Mensajes: 9186
Registrado: Jue Abr 12, 2007 7:00 am
Ubicación: tras la pantalla (...)
Contactar:

Re: ¿Cómo listo un determinado rango de archivos con ls?

Mensaje por niky45 » Mar Sep 18, 2012 7:46 pm

SEGURO que en el man hay alguna forma limpia de hacerlo, pero mientras tanto....

Código: Seleccionar todo

MIN=15
MAX=75
i=$MIN
while [ "$i" -lt "$MAX"  ]; do
  ls base.$i
  i=$i+1
done
por cierto: echale un ojo a la parte de las llaves (brace expansion, sorry no tengo ganas de buscar ahora :D ), porque yo juraria que se tiene que poder.... http://linux.die.net/man/1/bash
#446716
>>"Linux: the operating system with a CLUE... Command Line User Environment".
(seen in a posting in comp.software.testing)

[ DNFD ] - [ F4A ] - [ dotfiles ]
Avatar de Usuario
elmohino
Forista Menor
Forista Menor
Mensajes: 95
Registrado: Lun Oct 20, 2008 7:00 am

Re: ¿Cómo listo un determinado rango de archivos con ls?

Mensaje por elmohino » Mar Sep 18, 2012 8:14 pm

Amiga niky45, gracias por su respuesta, pero su script me da el siguiente fallo:

Código: Seleccionar todo

usuario@debian:~$ MIN=015 && MAX=047 && i=$MIN && while [ "$i" -lt "$MAX"  ]; do ls boda*$i && i=$i+1; done
boda_este.7z.015
bash: [: 015+1: se esperaba una expresión entera
usuario@debian:~$
Yo creo que he encontrado otra manera:


Código: Seleccionar todo

    usuario@debian:~$ ls [nombre_base]* | grep -A 32 [nombre_base].015
    [nombre_base].015
    [nombre_base].016
    .....
    [nombre_base].047
    usuario@debian:~$
Salud y gracias de nuevo.
Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

Re: ¿Cómo listo un determinado rango de archivos con ls?

Mensaje por akodo » Mar Sep 18, 2012 9:30 pm

@elmohino Imagino que sabrás que estás haciendo trampas gordas en tu script, y que basándome en la descripción del problema dado, tu script no sirve como solución.

Te pongo un caso verosímil:

Código: Seleccionar todo

[nombre_base].015
[nombre_base].016
[nombre_base].016.bak
[nombre_base].016.swp
[nombre_base].017
Los archivos temporales .bak y .swp (en este caso concreto) también se listarían, y lo que es peor, el 046 y 047 no.

Ahora bien, si me aseguras que eso no va a ocurrir nunca jamas, entonces adelante.
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])
Avatar de Usuario
elmohino
Forista Menor
Forista Menor
Mensajes: 95
Registrado: Lun Oct 20, 2008 7:00 am

Re: ¿Cómo listo un determinado rango de archivos con ls?

Mensaje por elmohino » Mar Sep 18, 2012 9:58 pm

akodo escribió:@elmohino Imagino que sabrás que estás haciendo trampas gordas en tu script, y que basándome en la descripción del problema dado, tu script no sirve como solución.

Te pongo un caso verosímil:

Código: Seleccionar todo

[nombre_base].015
[nombre_base].016
[nombre_base].016.bak
[nombre_base].016.swp
[nombre_base].017
Los archivos temporales .bak y .swp (en este caso concreto) también se listarían, y lo que es peor, el 046 y 047 no.

Ahora bien, si me aseguras que eso no va a ocurrir nunca jamas, entonces adelante.

Tiene Ud. mucha razón... También se listarían los archivos con extensión ~...

Habría que "limpiar" manualmente esos "residuos", o buscar otra manera (pero yo no soy un experto en bash). Quizás habría que filtrarlos de alguna manera (¿if then?).

Gracias por la puntualización.

Salud.

EDIT:

¡Basta de trampas gordas!:

Código: Seleccionar todo

    usuario@debian:~$ ls [nombre_base].??? | grep -A 32 [nombre_base].015
    [nombre_base].015
    [nombre_base].016
    .....
    [nombre_base].047
    usuario@debian:~$
Con el comodín "?" ya sólo se listarán los archivos con extensión de no más ni menos 3 caracteres.

Salud.
Última edición por elmohino el Mar Oct 02, 2012 4:50 pm, editado 1 vez en total.
Avatar de Usuario
niky45
Forista Ancestral
Forista Ancestral
Mensajes: 9186
Registrado: Jue Abr 12, 2007 7:00 am
Ubicación: tras la pantalla (...)
Contactar:

Re: ¿Cómo listo un determinado rango de archivos con ls?

Mensaje por niky45 » Mar Sep 18, 2012 10:04 pm

perdon. se me paso.
niky45 escribió:
MIN=15
MAX=75
i=$MIN
while [ "$i" -lt "$MAX"  ]; do
  ls base.$i
  i=$(($i+1))
done
por cierto, cuidado con el &&. la sintaxis para un one-liner seria sustituyendo los saltos de linea por el punto y coma ;, no opr el &&. y nota: NO todos.

aun asi, mucho mas practico una funcion, donde va a parar.....

Código: Seleccionar todo

listfiles(){
[ "$1" ] && MIN="$1" || MIN=0
# para que no haga cosas raras si no se especifca maximo. de lo contrario, entraria en un loop infinito.
[ "$2" ] && MAX="$2" || MAX=0 
i=$MIN
while [ "$i" -lt "$MAX"  ]; do
  ls base.$i
 [color=#FF0000] i=$(($i+1))[/color]
done ; }
## y luego solo: 
listfiles 20 35
#446716
>>"Linux: the operating system with a CLUE... Command Line User Environment".
(seen in a posting in comp.software.testing)

[ DNFD ] - [ F4A ] - [ dotfiles ]
Avatar de Usuario
elmohino
Forista Menor
Forista Menor
Mensajes: 95
Registrado: Lun Oct 20, 2008 7:00 am

Re: ¿Cómo listo un determinado rango de archivos con ls?

Mensaje por elmohino » Mar Oct 02, 2012 4:53 pm

Ahora sí funciona la línea de comandos (y usando ;, como Vd. aconseja).

Y muchas gracias por el script. Me va a servir de mucho.

Salud.


EDIT:

Tenía Vd. razón, amiga niky45, con las expansiones de bash:

Código: Seleccionar todo

ls [nombre_base].{015..047}
Así sólo se listarán desde el 015 al 047, ambos inclusive.

Salud.
Responder
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje