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.find
já 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
).