Talvez ele não atenda aos resultados esperados devido ao filtro grep. E quanto a isto:find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string
artistoex
Qual é o objetivo que você deseja alcançar? Na saída você está recebendo seqüências de caracteres grepped de arquivos, deseja o caminho desses arquivos?
Mirkobrankovic
Sim, quero imprimir o caminho dos arquivos que contêm a string 'some string'. A sugestão @artistoex imprime todos os caminhos de arquivo.
H.Rabiee
Você pode simplesmente usar o ackgrep em todos os arquivos no diretório atual, possivelmente filtrando apenas em certos tipos de arquivo.
Jaap Ancianidade
Respostas:
87
Isso grepocorre porque você está alimentando um fluxo de texto que, por acaso, contém nomes de arquivos. Como você não forneceu nomes de arquivos como argumentos para grep, não se pode esperar deduzir de que arquivo veio uma linha correspondente. Use xargs:
find .-type f -print | xargs grep "some string"
Como você possui o GNU find / xargs, esta é uma maneira mais segura de o xargs ler os nomes de arquivos:
find .-type f -print0 | xargs -0 grep "some string"
Se você deseja apenas os nomes de arquivos que têm uma linha correspondente sem mostrar a linha correspondente:
Como você pode ver na saída, temos o nome do arquivo: hit row: search string
Aqui está uma descrição mais detalhada dos parâmetros usados:
-r Para cada operando de diretório, leia e processe todos os arquivos nesse diretório, recursivamente. Siga os links simbólicos na linha de comando, mas pule os links simbólicos encontrados recursivamente. Observe que, se nenhum operando de arquivo for fornecido, o grep pesquisará o diretório de trabalho. É o mesmo que a opção '--directories = recurse'.
-i Imprime o nome do arquivo para cada correspondência. Esse é o padrão quando há mais de um arquivo para pesquisar.
-n Prefixa cada linha de saída com o número da linha com base em 1 em seu arquivo de entrada. (-n é especificado pelo POSIX.)
-H Imprime o nome do arquivo para cada correspondência. Esse é o padrão quando há mais de um arquivo para pesquisar.
-o Imprima apenas as partes correspondentes (não vazias) das linhas correspondentes, com cada uma dessas partes em uma linha de saída separada. As linhas de saída usam os mesmos delimitadores da entrada e os delimitadores são bytes nulos se -z (--null-data) também for usado (consulte Outras opções).
find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string
ack
grep em todos os arquivos no diretório atual, possivelmente filtrando apenas em certos tipos de arquivo.Respostas:
Isso
grep
ocorre porque você está alimentando um fluxo de texto que, por acaso, contém nomes de arquivos. Como você não forneceu nomes de arquivos como argumentos para grep, não se pode esperar deduzir de que arquivo veio uma linha correspondente. Usexargs
:Como você possui o GNU find / xargs, esta é uma maneira mais segura de o xargs ler os nomes de arquivos:
Se você deseja apenas os nomes de arquivos que têm uma linha correspondente sem mostrar a linha correspondente:
fonte
sed '...' $(find ... | xargs grep -l ...)
eu uso
e trabalhando mais rápido
ps
Caso de uso mais complexo
Para ler a explicação do parâmetro i
fonte
-n
se você quiser números de linha. +1 para resposta simplificada.Frequentemente procuro o código-fonte em estruturas de pastas complexas e acho útil usar:
Com esses parâmetros, sem usar find , obtenho o caminho completo do arquivo e o número da linha que contém a sequência especificada .
Também é fácil lembrar, porque o BASH é através da sua pesquisa como um rHino :)
Vou mostrar como isso funciona com um exemplo rápido.
Vamos exibir o conteúdo de um arquivo usando cat:
E vamos procurar recursivamente todos os arquivos que contêm a string "iptables -P":
Como você pode ver na saída, temos o nome do arquivo: hit row: search string
Aqui está uma descrição mais detalhada dos parâmetros usados:
fonte
eu preferi
| encontre o arquivo | faça grep ont encontrando arquivo | mostre o caminho completo do arquivo
encontre / -type f -exec grep 'alguma string' {} \; -exec echo {} \;
fonte
O Silver Searcher é um utilitário muito rápido e útil para pesquisar arquivos e conteúdo.
Para resolver seu problema, o comando silver searcher ficaria assim ...
ag 'some string' -l
-l
Imprimir apenas nomes de arquivos que contenham correspondências (não imprima as linhas correspondentes)fonte