cat últimos 5 archivos en un directorio

cat últimos 5 archivos en un directorio

Tengo un directorio con nombres de archivos con el formato $date.txt. Me gustaría obtener los 5 archivos más recientes. ¿Existe una solución más elegante para eso que

for f in 2*.txt; do echo $f; done | tail -5 | while read f; do cat $f; done

Respuesta1

En o ksh93:​bashzsh

files=( 2*.txt )
cat "${files[@]: -5}"

Esto crearía una matriz de nombres de archivos que coincidan con el patrón 2*.txt. Luego generaría el contenido de los últimos cinco de ellos.

En zsh, también puede especificar un rango de archivos como parte de suclasificatorios globales:

cat 2*.txt([-5,-1])

En cualquier shell POSIX, esto también se puede hacer a través de

set -- 2*.txt
while [ "$#" -gt 5 ]; do shift; done   # or: [ "$#" -gt 5 ] && shift "$(( $# - 5 ))"
cat "$@"

Esto establece los parámetros posicionales para los nombres de archivos que coinciden con el patrón. Luego desplaza los nombres desde el principio de la lista hasta que la lista solo tiene cinco elementos. catLuego se invoca en los nombres de archivos restantes.

En todas estas soluciones, los archivos se ordenarían lexicográficamente. Los nombres de archivos con espacios o nuevas líneas se manejan correctamente.

Respuesta2

Usaría un bucle while de lectura, esto manejaría archivos con espacios.

ls 2*.txt | tail -5 | while read loop
do
  cat "$loop" 
done 

Si siempre quieres los 5 más recientes, puedes cambiarlos als -tr | tail -5

Respuesta3

Según la pregunta, sin perspectivas de espacios y 2*.txt felizmente devolviendo el pedido correcto, ¿qué tal

cat $(ls 2*.txt|tail -5)

Respuesta4

Como se mencionó latesten la pregunta, podemos verificar con la hora de modificación de los archivos en el directorio.

 cat $(ls -ltr *.txt | tail -n5 | awk '{print $NF}' | tr '\n' ' ')
  • ls -ltr- enumerará los archivos con respecto a la marca de tiempo de modificación (inversa)

  • tail -n5- tomará los últimos 5 archivos

  • $NF- último campo

  • tr- transponer columna a fila

información relacionada