
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
:bash
zsh
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. cat
Luego 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ó latest
en 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 campotr
- transponer columna a fila