find /var/logs/ -name 'foo*.log' -print0 | tail -r | xargs -0 bar
Deve funcionar do jeito que você quer (isso foi testado no Mac OS X e eu tenho uma ressalva abaixo ...).
Da página do manual para encontrar:
-print0
This primary always evaluates to true. It prints the pathname of the current file to standard output, followed by an ASCII NUL character (charac-
ter code 0).
Basicamente, você está encontrando os arquivos que correspondem à sua string + glob e terminando cada um com um caractere NUL. Se os seus nomes de arquivos contiverem novas linhas ou outros caracteres estranhos, o find deve lidar com isso bem.
tail -r
pega a entrada padrão através do pipe e a inverte (observe que tail -r
imprime todos da entrada para stdout, e não apenas as últimas 10 linhas, que é o padrão. man tail
para mais informações).
Em seguida, encaminhamos isso para xargs -0
:
-0 Change xargs to expect NUL (''find /var/logs/ -name 'foo*.log' -print0 | tail -r | xargs -0 bar
'') characters as separators, instead of spaces and newlines. This is expected to be used in concert with the
-print0 function in find(1).
Aqui, xargs espera ver os argumentos separados pelo caractere NUL, que você passou de find
e inverteu com tail
.
Minha advertência: Eu li que tail
não joga bem com strings com terminação nula . Isso funcionou bem no Mac OS X, mas não posso garantir que isso seja o caso de todos os * nixes. Pise com cuidado.
Eu também devo mencionar que GNU Parallel é frequentemente usado como uma alternativa xargs
. Você pode verificar isso também.
Eu posso estar perdendo alguma coisa, então outros devem entrar em contato.