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


En bash, ¿cómo puedo imprimir el primero n elementos de una lista?

Por ejemplo, los primeros 10 archivos en esta lista:

FILES=$(ls)

ACTUALIZAR: Olvidé decir que quiero imprimir los elementos en una línea, al igual que cuando imprimes toda la lista con echo $FILES.


9
2018-05-20 00:01


origen


Respuestas:


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

Debería 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 ejemplos sobre el uso de matrices en bash. (gracias lhunath)


23
2018-05-20 00:08



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

También manejé espacios en los nombres de archivo cuando lo probé.


5
2017-08-25 18:39



¿Por qué no solo esto para imprimir los primeros 50 archivos?

ls -1 | head -50

4
2018-01-18 15:04



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

Editar: AAh, se perdió su comentario de que los necesitaba en una línea ...

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

Eso hace eso.


2
2018-05-20 20:00



Mi camino sería:

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

Esto imprimirá las primeras 10 líneas devueltas por ls, y luego tr reemplazará todos los saltos de línea con espacios. La salida estará en una sola línea.


2
2018-06-10 10:28



hacerlo interactivamente

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

para ejecutarlo como un script, crea foo.sh con contenido

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

y ejecutarlo como

bash foo.sh 10 $FILES


1
2018-05-21 05:32



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

0
2018-05-20 00:08



Una adición a la respuesta de "Ayman Hourieh" y "Shawn Chin", en caso de que sea necesario para algo más que el contenido de un directorio.

En la versión más nueva de bash, puede usar mapfile para almacenar el directorio en una matriz. Ver help mapfile

mapfile -t files_in_dir < <( ls )

Si lo quieres completamente en bash uso printf "%s\n" * en lugar de lso simplemente reemplazar ls con cualquier otro comando que necesites

Ahora puede acceder a la matriz como de costumbre y obtener la información que necesita.

Primer elemento:

${files_in_dir[0]}

Último elemento (no olvide el espacio después de ":"):

${files_in_dir[@]: -1}

Rango, por ej. de 10 a 20:

${files_in_dir[@]:10:20}

Atención para grandes directorios, esto consume mucho más memoria que las otras soluciones.


0
2017-08-19 08:32