Eu vou cutucar o seu próprio loop, e tentar entender o que ele está realmente fazendo, e então ver como você pode conseguir o que você quer.
Como você inicia seu loop é extremamente complexo: ls | while read -r file; . Você está canalizando os resultados de ls para seu while read , não é grande coisa, ainda funciona, embora eu recomende um loop for mais como:
for file in ./* ;
Isso fará um loop pelos mesmos arquivos, mas será um pouco mais direto. Além disso, o comando ls pode retornar a saída que não é apenas os nomes de arquivos (já note que ls tem cores de fonte diferentes para diretórios / executáveis?), E isso pode causar outros lamentos de comandos.
Seu comando: egrep "ERROR|FAIL|WARN" > ../errors-$file está tentando egrep para ERROR|FAIL|WARN em nada e redirecionando a saída para ../errors-$file .
A sintaxe para egrep é:
egrep [search pattern] [location]
Então, você está perdendo a localização para egrep procurar. Você pode corrigir isso adicionando $file após seu padrão, de modo que se torne:
#!/bin/bash
mkdir result
cd $1
for file in $(find ./ -type f)
do
egrep "ERROR|FAIL|WARN" $file > ../result/errors-$(basename $file)
echo "-------------------------------" >> ../result/errors-$(basename $file)
egrep "denied" -B 1 $file >> ../result/errors-$(basename $file)
done