cat últimos 5 arquivos em um dir

5

Eu tenho um diretório com nomes de arquivos do formato $ date.txt. Eu gostaria de cat 5 últimos arquivos a partir 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
    
por LazyCat 31.05.2018 / 00:25

4 respostas

7

Em ksh93 , bash ou zsh :

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

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

Em zsh , você também pode especificar um intervalo de arquivos como parte de seus qualificadores glob :

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

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

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, 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.

    
por 31.05.2018 / 07:35
1

Eu usaria um loop de leitura while, isso manipularia arquivos com espaços.

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

Se você quiser sempre as 5 mais recentes, poderá alterá-lo para ls -tr | tail -5

    
por 31.05.2018 / 06:02
1

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

cat $(ls 2*.txt|tail -5)
    
por 31.05.2018 / 00:39
0

Como mencionado latest em questão, podemos verificar com o tempo de modificação dos arquivos no diretório.

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

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

  • $NF - último campo

  • tr - transpõe coluna para linha

por 31.05.2018 / 06:57

Tags