2009-05-20 27 views
9

En bash, ¿cómo puedo imprimir los primeros n elementos de una lista?En bash, ¿cómo puedo imprimir los primeros n elementos de una lista?

Por ejemplo, los primeros 10 archivos en esta lista:

FILES=$(ls) 

ACTUALIZACIÓN: me olvidaba decir que quiero imprimir los elementos en una sola línea, al igual que cuando se imprime toda la lista con echo $FILES.

+0

Hice una pequeña corrección en mi solución. Debería imprimir todos los nombres de archivo en una línea. ¿Lo intentaste? –

+1

Lea: http://mywiki.wooledge.org/ParsingLs - Es importante que comprenda las complejidades y las trampas de bash si desea evitar desastres en sus archivos. – lhunath

Respuesta

22
FILES=(*) 
echo "${FILES[@]:0:10}" 

Deberían funcionar correctamente incluso si hay espacios en los nombres de archivo.

FILES=$(ls) crea una variable de cadena. FILES=(*) crea una matriz. Vea esta página para más examples on using arrays in bash. (Lhunath gracias)

+0

que imprime los primeros 10 caracteres, ¿verdad? – Frank

+0

No, imprime los primeros 10 elementos de una matriz. La matriz contiene nombres de archivo como elementos. –

+0

Su referencia al ABS es mala. No utilizan comillas (ABS típico), lo que causa errores de división de palabras en el nombre de archivo expandido. ABS está lleno de errores ocultos que causan que cualquiera que aprenda de él (¡excepto tú, aparentemente, lo hagas bien) herede esos errores! Me referiría a http://mywiki.wooledge.org/BashGuide/TheBasics/Arrays en su lugar. – lhunath

0
FILES=$(ls) 
echo $FILES | fmt -1 | head -10 
+2

No funciona como se esperaba si hay archivos con espacios en sus nombres. –

+0

Soy consciente de eso, pero pensaba que dehmann quería usar este método específico, así que calculé que los espacios no serían un problema. Por cierto, ¿te refieres a files = (*) eco "$ {ARCHIVOS [@]: 0:10}" ? Eso funciona mejor aquí. – sunny256

+1

De hecho, corrijo esto. ¡Gracias! –

2
echo $FILES | awk '{for (i = 1; i <= 10; i++) {print $i}}' 

Editar: Ah, se perdió su comentario de que los hubiera necesitado en una línea ...

echo $FILES | awk '{for (i = 1; i <= 10; i++) {printf "%s ", $i}}' 

que uno hace eso.

1

hacerlo de forma interactiva:

set $FILES && eval eval echo \\\${1..10}

ejecutarlo como un guión, crear foo.sh con contenidos

N=$1; shift; eval eval echo \\\${1..$N}

y ejecutarlo como

bash foo.sh 10 $FILES

5
FILE="$(ls | head -1)" 

Manejé espacios en los nombres de archivo correctamente también cuando lo probé.

+0

Esto le puede dar varios directorios. Quizás te refieres a '$ (ls -1 | head -1)'? – nh2

4

Por qué no sólo esta opción para imprimir los primeros 50 archivos:

ls -1 | head -50 
+0

OP lo quería impreso en una línea. Ver comentarios. – kubanczyk

2

Mi manera sería:

ls | head -10 | tr "\n" " " 

Esto imprimirá las primeras 10 líneas devueltos por ls, y luego tr sustituye a todas las saltos de línea con espacios. La salida estará en una sola línea.

+0

Buena respuesta. Tal vez también deberías agregar '-1' como' ls -1 | cabeza -10 | tr "\ n" "" '. En cualquier caso, esto es lo que estaba buscando;) – silgon

+0

Esta es la mejor respuesta en mi opinión. Agradable y simple. Ponlos en una lista. Seleccione los primeros 10. Elimine los saltos de los espacios. Hecho y hecho. Buena respuesta. – user2233949

Cuestiones relacionadas