
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
, bash
ou 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 latest
na 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 campotr
- transpor coluna para linha