Piping o resultado de ls para tail [duplicate]

1

Eu tenho um diretório com vários arquivos de log. Algo parecido com isto:

data170213.log
data170214.log
data170215.log
data170216.log

Estou interessado em ver as últimas entradas do arquivo mais recente e segui-lo. Se eu sei que o arquivo mais recente é data170216.log , eu posso fazer isso com

tail -f data170216.log

O problema é que não sei qual é o nome do arquivo mais recente no diretório. Eu posso identificá-lo embora com

ls -1r *.log | head -1

O que não consigo resolver é como enviar o resultado do comando ls -1r * .log | head -1 ao comando tail -f [FILE]

Eu tentei o seguinte, sem sucesso

tail -f < ls -1r *.log | head -1
    
por Dewald Swanepoel 16.02.2017 / 15:17

2 respostas

5

Use uma substituição de comando :

tail -f "$(ls -1r *.log | head -n 1)"

Isso executa ls -1r *.log | head -n 1 em uma subshell, obtém sua saída e constrói um novo comando usando isso; Então, se o ls pipe gera data170216.log , o comando se torna

tail -f "data170216.log"

que é o que você procura.

Anote head -n 1 em vez de head -1 ; a última forma está obsoleta agora.

    
por 16.02.2017 / 15:21
1

Você pode usar xargs nesses casos. Pode ser simples e fácil:

$ ls -1r *.log | sed -n 1p | xargs tail -f

Ou:

$ ls -1r *.log | head -1 | xargs tail -f

Ambos funcionam bem.

Veja man xargs

EXEMPLOS:

find /tmp -name core -type f -print | xargs /bin/rm -f

Find files named core in or below the directory /tmp and delete them.  Note that this will work incorrectly if there are any filenames containing newlines or spaces.

find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f

Find  files named core in or below the directory /tmp and delete them, processing filenames in such a way that file or directory names containing spaces or newlines are correctly han‐
   dled.

find /tmp -depth -name core -type f -delete

Find files named core in or below the directory /tmp and delete them, but more efficiently than in the previous example (because we avoid the need to use fork(2) and exec(2) to launch
   rm and we don't need the extra xargs process).

cut -d: -f1 < /etc/passwd | sort | xargs echo

Generates a compact listing of all the users on the system.

xargs sh -c 'emacs "$@" < /dev/tty' emacs

Launches  the  minimum number of copies of Emacs needed, one after the other, to edit the files listed on xargs' standard input.  This example achieves the same effect as BSD's -o op‐
   tion, but in a more flexible and portable way.
    
por 16.02.2017 / 16:09

Tags