Por que o arquivo grep do exec é um loop infinito?

2

Eu estava tentando coletar todo o ID da mensagem: cabeçalhos (linhas) em um diretório com arquivos de 200K .eml (texto simples). Um pouco ingenuamente, eu disse:

find -type f -exec grep -Fi "message-id:" {} \; > messageids.txt

Deixei isso acontecer da noite para o dia, já que imaginei que demoraria um pouco para percorrer muitos arquivos. Um pouco para minha surpresa esta manhã, messageids.txt é 1.7TB e minha partição está cheia. Eu percebo que o que deve ter acontecido é que a própria saída do grep está sendo captada como entrada, mas eu não esperaria (e ainda não, intuitivamente) repetir repetidamente. O que significa que minha compreensão das forças em jogo não é tão strong quanto deveria ser.

Alguém pode fornecer uma explicação detalhada de como o comando acima funciona e por que esse loop infinito deve (suponho) ser esperado? Obrigado.

Atualização: A maneira que eu esperava que funcionasse é que find encontra uma lista de arquivos, e em cada um deles o grep é chamado. Então, em algum momento, o grep é chamado em messageids.txt. Se eu fizesse isso, digamos, um comando de ordenação, o messageids.txt seria criado assim que o comando fosse executado (possivelmente, batendo nele, se já existisse), mas não seria preenchido até que o comando fosse concluído. Nesse caso, para que o loop seja infinito, o arquivo deve estar sendo preenchido antes que a saída seja concluída, mas de forma que a entrada do grep permaneça perpetuamente nela. Essa é a parte que não se comporta como eu esperava, e eu estava esperando por uma explicação detalhada de como esta cadeia de processos está sendo executada para que eu possa consolidar meus fundamentos do Linux.

    
por Hammer Bro. 22.02.2012 / 18:22

2 respostas

3

Sempre que encontrar uma linha com message-id , ela gravará em messageids.txt . E toda vez que ele escreve uma linha com message-id para messageids.txt , ele logo a encontra. Então, esse é um loop sem fim trivial.

    
por 22.02.2012 / 18:36
0

Acabei de testar algo assim e funcionou.

for f in $(find . -type f); do grep -Fi "message-id:" $f > messageids.txt; done

    
por 22.02.2012 / 18:42