cat últimos 5 arquivos em um diretório

cat últimos 5 arquivos em um diretório

Eu tenho um diretório com nomes de arquivos no formato $date.txt. Eu gostaria de obter os 5 arquivos mais recentes dele. Existe uma solução mais elegante para isso do que

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

Responder1

Em ksh93, bashou zsh:

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

Isso criaria uma matriz de nomes de arquivos correspondentes ao padrão 2*.txt. Em seguida, produziria o conteúdo dos últimos cinco deles.

No zsh, você também pode especificar um intervalo de arquivos como parte de seueliminatórias globais:

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

Em qualquer shell POSIX, isso também pode ser feito através

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

Isso define os parâmetros posicionais para os nomes de arquivos que correspondem ao padrão. Em seguida, ele desloca os nomes do início da lista até que a lista tenha apenas cinco elementos. caté então invocado nos nomes de arquivos restantes.

Em todas essas soluções, os arquivos seriam classificados lexicograficamente. Nomes de arquivos com espaços ou novas linhas são tratados corretamente.

Responder2

Eu usaria um loop while read, isso lidaria com arquivos com espaços.

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

Se você quiser sempre os 5 mais recentes, poderá alterá-lo parals -tr | tail -5

Responder3

Com base na pergunta, sem perspectiva de espaços e 2*.txt retornando alegremente a ordem correta, que tal

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

Responder4

Conforme mencionado latestna pergunta, podemos verificar o horário de modificação dos arquivos no diretório.

 cat $(ls -ltr *.txt | tail -n5 | awk '{print $NF}' | tr '\n' ' ')
  • ls -ltr- listará os arquivos em relação ao carimbo de data e hora da modificação (reverso)

  • tail -n5- levará os últimos 5 arquivos

  • $NF- último campo

  • tr- transpor coluna para linha

informação relacionada