Eu assumo, a partir de sua descrição, que você está fazendo isso (quebrei em quatro linhas para evitar a rolagem horizontal)
>tmp.txt;
find . -type f -name "*.pb*" \
-exec grep -Hn pattern "{}" ";" >>tmp.txt;
cat tmp.txt | more
Se você estiver usando o Gnu find, poderá usar -execdir em vez de -exec ; Isso fará com que o comando grep seja executado a partir do diretório do arquivo de destino, com o resultado de que o nome do arquivo será relativo ao diretório em que ele está. (por exemplo, ./filename.ext ). Isso não é bastante o que você está pedindo, mas está bem próximo, e há outras boas razões para usar -execdir .
-execdir grep -Hn pattern "{}" ";" # See note 1
Outra opção é usar um shell intermediário para editar o rótulo do nome do arquivo. Isso requer o Gnu grep para a opção --label :
-exec bash -c 'grep -Hn --label="$(basename "$1")" pattern "$1"' \
_ "{}" ";"
Isso é um pouco mais longo e funciona muito mais para o sistema operacional, mas elimina o ./ .
Para a segunda opção, você pode canalizar toda a saída através de sed , inserindo uma nova linha após o primeiro (ou segundo) : em cada linha.
find . -type f -name "*.pb*" \
-exec grep -Hn pattern "{}" ";" |
sed 's/:/&\n/' >>tmp.txt.
ou (segundo cólon):
find . -type f -name "*.pb*" \
-exec grep -Hn pattern "{}" ";" |
sed 's/:[^:]*:/&\n/' >>tmp.txt.
Notas
-
Não faz sentido dizer ao grep para fazer uma pesquisa recursiva (
-r) porque você nunca está dando a ele um diretório como argumento.findjá encontrou recursivamente todos os arquivos. Então, removi a opção de todos os meus exemplos. -
cat tmp.txt | moreé inútil Uso do Cat (UUOC). Apenas usemore tmp.txt. -
Com o Gnu, encontre substituir
;por+para obter mais eficiência (exceto no exemplo que usabash -c).