Pipe resulta de grep em find

1

Eu tenho um arquivo de log com alguns nomes de arquivos entre outros eventos, que eu preciso encontrar em subpastas. A mesma necessidade para nomes de arquivos dentro de arquivos xml que devem ser encontrados dentro de algumas pastas e subpastas. Parece que eu deveria usar o grep no arquivo de log e extrair nomes exatos de arquivos, alimentá-los para encontrar. Eu posso facilmente obter uma lista de nomes de arquivos um por linha, mas fazê-lo funcionar com o find não está exatamente funcionando. E a internet está cheia de respostas para outro caminho - encontrar resultados alimentando o grep.

grep -oP '(?<=Some problem with file named ).*pdf?(?=\.)' /home/myname/log/myspecificlogfile.log

Eu tentei canalizar os resultados deste comando para xargs e find, mas ele não dá nenhum resultado tanto nos arquivos que não estão lá como nos que estão lá. Eco é apenas para simplificar, encontrar o parâmetro -ls ainda não está adicionado (mas vou precisar dele):

echo 12345.pdf | xargs -0 -I{} find /home/myname/workfolders/ -name '{}'    #Nonexisting pdf
echo 67890.pdf | xargs -0 -I{} find /home/myname/workfolders/ -name '{}'   #Existing pdf, no results

Como obtenho resultados do grep canalizados para encontrar meus arquivos em uma pasta e, eventualmente, subpastas?

    
por uldics 15.11.2016 / 14:51

2 respostas

2

Eu faria:

grep -oP '(?<=Some problem with file named ).*pdf(?=\.)' \
  /home/myname/log/myspecificlogfile.log | awk -F / '
     ARGIND == 1 {files[$0]; next}
     $NF in files' - RS='
grep -oP '(?<=Some problem with file named ).*pdf(?=\.)' \
  /home/myname/log/myspecificlogfile.log | awk -F / '
     ARGIND == 1 {files[$0]; next}
     $NF in files' - RS='%pre%' <(
     find /home/myname/workfolders/ -name '*pdf' -type f -print0)
' <( find /home/myname/workfolders/ -name '*pdf' -type f -print0)

(assume a implementação GNU de grep e awk e um shell com suporte para substituição de processo como ksh , zsh ou bash ).

Usar find -name não seria ideal para nomes de arquivos *.pdf ou ?.pdf , por exemplo. Executar um find por nome de arquivo seria ineficiente. Mesmo que você tenha feito uma solução que chame um find com -name a.pdf -o -name b.pdf... , isso provavelmente ainda será menos eficiente do que uma pesquisa de hash como feita por awk .

    
por 15.11.2016 / 14:57
0

Outra variante a ser usada find + grep

find /home/myname/workfolders/ \
     -name '*pdf' -type f -exec grep -qFf \
          <(grep -oP '(?<=Some problem with file named ).*pdf?(?=\.)'\
                 /home/myname/log/myspecificlogfile.log) \
     -print

Ou você pode dividi-lo em dois comandos com pipe

find /home/myname/workfolders/ -name '*pdf' -type f |
grep -qFf <(grep -oP '(?<=Some problem with file named ).*pdf?(?=\.)' \
            /home/myname/log/myspecificlogfile.log)
    
por 15.11.2016 / 17:22

Tags