Encontrar ficheiros que contenham uma determinada cadeia usando o find (1) e o grep (1)
find . -type f -print -exec cat {} \; | grep some string
O comando acima não imprime o caminho do ficheiro.
Estou a utilizar: Ubuntu, bash 4
.
find . -type f -print -exec cat {} \; | grep some string
O comando acima não imprime o caminho do ficheiro.
Estou a utilizar: Ubuntu, bash 4
.
Uso
grep "some string" . -R
e funciona mais rápido
p.s.
Caso de uso mais complexo
grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex
Para ler a explicação param i
grep --help | grep -- -i
Isto porque está a alimentar grep
um fluxo de texto que por acaso contém apenas nomes de ficheiros. Uma vez que não forneceu nomes de ficheiro como argumentos para o grep, não se pode esperar que deduza de que ficheiro veio uma linha correspondente. Use xargs
:
find . -type f -print | xargs grep "some string"
Uma vez que tem GNU find/xargs, esta é uma forma mais segura para xargs ler nomes de ficheiros:
find . -type f -print0 | xargs -0 grep "some string"
Se quiser apenas os nomes de ficheiros que têm uma linha correspondente sem mostrar a linha correspondente:
find . -type f -print0 | xargs -0 grep -l "some string"
Procuro frequentemente o código fonte em estruturas de pastas complexas e considero útil a sua utilização:
cd /your/folder/
grep -rHino "your string"
Com estes parâmetros, sem utilizar o find, obtenho o file caminho completo* e o número de linha* que contém a fila especificada*.
Também é fácil de lembrar porque BASHes através da sua pesquisa como um rHino* :)
Vou mostrar como isto funciona com um exemplo rápido.
Vamos mostrar o conteúdo de um ficheiro utilizando o gato:
jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
E vamos pesquisar recursivamente por todos os ficheiros que contenham a string “iptables -P”:
jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P
Como pode ver na saída temos filename:hit row:searched string
Aqui está uma descrição mais detalhada dos parâmetros utilizados:
-r Para cada operando de directório, leia e processe todos os ficheiros desse directório, recursivamente. Siga as ligações simbólicas na linha de comando, mas salte os links simbólicos que são encontrados recursivamente. Note que se não for dado um operando de ficheiro, o grep pesquisa o directório de trabalho. Isto é o mesmo que a opção ‘–directórios=encomenda’.
-i Imprimir o nome do ficheiro para cada correspondência. Este é o padrão quando há mais do que um ficheiro a pesquisar.
-n* Prefixa cada linha de saída com o número de linha baseado em 1 dentro do seu ficheiro de entrada. (-n é especificado pelo POSIX.)
-H* Imprimir o nome do ficheiro para cada correspondência. Este é o padrão quando há mais do que um ficheiro a pesquisar.
-o Imprimir apenas as partes correspondentes (não vazias) das linhas correspondentes, com cada uma dessas partes numa linha de saída separada. As linhas de saída utilizam os mesmos delimitadores como entrada, e os delimitadores são bytes nulos se -z (–null-data) for também utilizado (ver Outras Opções).
Preferi
| find the file |make grep ont finding file | show de full path of the file
find / -type f -exec grep ‘some string’ {} {}; -exec echo {} {} {};
Silver Searcher ](https://github.com/ggreer/the_silver_searcher) é uma utilização muito rápida e útil para pesquisar ficheiros e conteúdos.
Para resolver o seu problema, o comando Silver Searcher teria este aspecto…
ag 'some string' -l
-l
Imprima apenas nomes de ficheiros que contenham correspondências (não imprima as linhas correspondentes)