encontra o último arquivo criado no conteúdo da pasta e do grep

4

Eu preciso pesquisar uma determinada pasta para o arquivo criado mais recente e usar o conteúdo para um padrão. Eu tive sucesso ok até agora usando este comando:

find /var/log/folder -type f -printf '%T+ %p\n' | sort | tail -n1 | xargs grep 'string to find'

Isso encontra o arquivo mais recente que possui a correspondência, mas estou recebendo uma linha inesperada no stdout.

$ find /var/log/folder -type f -printf '%T+ %p\n' |   sort | tail -n1 | xargs grep 'string to find'
grep: 2016-05-12+20:01:59.0570667340: No such file or directory
/var/log/folder/file:string to find

Como posso alterar meu comando para que ele não forneça a linha "não há arquivo ou diretório"?

    
por user53029 13.05.2016 / 04:06

2 respostas

4

Aqui está uma versão segura para nomes com espaço em branco:

find /var/log/folder -type f -printf '%T@ %p
find /var/log/folder -type f -printf '%T@ %p%pre%' | sort -rz | sed -Ezn '1s/[^ ]* //p' | xargs --null grep string
' | sort -rz | sed -Ezn '1s/[^ ]* //p' | xargs --null grep string

Como funciona:

  • find /var/log/folder -type f -printf '%T@ %psort -rz'

    Isso procura por arquivos e imprime seu tempo de modificação (segundos) seguido por um espaço e seu nome seguido por um caractere nulo.

  • sed -Ezn '1s/[^ ]* //p'

    Isso classifica os dados separados por nulos.

  • sed -z

    xargs --null grep string lida com linhas delimitadas por caracteres nul e isso imprime apenas o nome do arquivo mais recente

  • %code%

    Isto lê o nome do arquivo separado por nulo e retorna a string.

por 13.05.2016 / 04:40
4

ls -1rt /path/to/files/ | tail -n1 encontrará o arquivo mais recente em um diretório (em termos de tempo de modificação); passar isso como um argumento para grep :

grep 'string to find' "$(ls -1rt /path/to/files/ | tail -n1)"
    
por 13.05.2016 / 04:10