for loop está pendente para não executar

0

Eu tentei encontrar todas as linhas contendo a palavra heaq no arquivo * .md

$  for i in $(find . -regex ".*md$"); do grep -i "heaq"; done
#pending
#pending

No entanto, está constantemente pendente lá.

Qual é o problema com o meu código?

    
por JawSaw 05.11.2018 / 02:04

2 respostas

4

É o grep que está "pendente". Quando grep é executado sem um nome de arquivo para ler, ele lê a entrada padrão. Se você não fornecer nenhum dado na entrada padrão, ele aparecerá "travado".

Você também está dando um loop pela saída de find . Isso é deselegante (o loop não será executado até que todos os nomes de caminho tenham sido encontrados por find ) e perigoso (os nomes de caminho serão divididos em espaços em branco e o shell executará a globalização de nomes de arquivo neles).

Em vez disso, se você quiser executar grep em todos os arquivos com um sufixo de nome de arquivo específico:

find . -type f -name '*.md' -exec grep -iF 'heaq' {} +

Eu alterei a coisa -regex para um teste -name padrão com um padrão que corresponde apenas aos nomes de arquivo com um sufixo .md do nome do arquivo. Eu também adicionei -type f , pois só faz sentido executar grep em arquivos regulares (você pode querer alterar -type f para ! -type d para executá-lo em qualquer não-diretório).

O grep é executado através de -exec em lotes nos nomes de caminhos encontrados. Estou usando -F com grep , pois estamos combinando uma string, não uma expressão regular. Você pode adicionar -w se quiser corresponder uma palavra em vez de qualquer substring.

Relacionados:

por 05.11.2018 / 07:50
3

você precisa passar o nome do arquivo para grep

então

$ for i in $(find . -regex ".*md$"); do grep -i "heaq" $i; done

você também pode usar

% grep -i -n "heaq" $(find . -regex ".*md$")

-n faz o grep imprimir os números de linha correspondentes

    
por 05.11.2018 / 02:23

Tags