Por que o grep falha
Fazendo isso em um terminal:
Falha - Aguardando entrada$ grep "index123"
Works - Recebe entrada de STDIN
$ echo -e "line1\nline2\nindex123blah\n" | grep "index123"
index123blah
O segundo funciona porque apresentamos a entrada para grep
para analisar via STDIN. grep
receberá informações de STDIN ou de um arquivo. No seu cenário:
if [[ "$d"=="*.out" && grep "index123"]]; then exit 1; fi
Também não está analisando, por isso está falhando.
Seu problema
Da aparência do seu código, acredito que você queira algo assim. Para começar, aqui estão alguns dados de amostra:
$ mkdir -p 1/2/{3..5}
$ echo "index123" > 1/2/3/blah.out
$ echo "index123" > 1/2/3/blip.out
$ echo "index" > 1/2/blip.out
$ echo "index" > 1/2/blah.out
E uma forma modificada do seu script:
$ cat loopy.bash
#!/bin/bash
while IFS= read -r d; do
grep -l "index123" "$d" && exit 1
done < <(find . -type f -name "*.out")
Em exibição:
$ ./loopy.bash
./1/2/3/blah.out
Emite o primeiro arquivo que encontrou index123
string e sai.
While loop uma boa solução?
Eu não faria assim. Usar um loop while
aqui dessa maneira não é necessário. Seria melhor usar uma arquitetura find .... | xargs ...
ou find ... -exec
do tipo de solução.
Veja @ resposta do DopeGhoti para uma melhor abordagem ao uso de find
com -exec
ou xargs
.
Imprimindo diretório contendo
Se você quiser simplesmente imprimir a árvore de diretórios que contém o arquivo correspondente, use dirname
para fazer isso da seguinte forma:
$ cat loopy2.bash
#!/bin/bash
while IFS= read -r d; do
grep -q "index123" "$d" && dirname "$d" && exit 1
done < <(find . -type f -name "*.out")
e executá-lo:
$ ./loopy2.bash
./1/2/3