Eu quero encontrar todos os arquivos que contêm uma string específica de texto. O grep
o comando funciona, mas não sei como usá-lo para cada diretório (só posso fazer isso para meu diretório atual). Eu tentei ler man grep
, mas não deu nenhuma ajuda.
Seria melhor usar
grep -rl "string" /path
onde
-
-r
(ou--recursive
) a opção é usada para atravessar também todos os subdiretórios de/path
, enquanto -
-l
(ou--files-with-matches
) a opção é usada apenas para imprimir nomes de arquivos de arquivos correspondentes, e não as linhas correspondentes (isso também pode melhorar a velocidade, dado quegrep
pare de ler um arquivo na primeira partida com esta opção).
Se você está procurando linhas correspondentes em arquivos, meu comando favorito é:
grep -Hrn 'search term' path/to/files
-
-H
faz com que o nome do arquivo seja impresso (implícito quando vários arquivos são pesquisados) -
-r
faz uma pesquisa recursiva -
-n
faz com que o número da linha seja impresso
path/to/files
pode ser .
para pesquisar no diretório atual
Outras opções que considero muito úteis:
-
-I
ignorar arquivos binários (complemento:-a
tratar todos os arquivos como texto) -
-F
tratarsearch term
como um literal, não uma expressão regular -
-i
faça uma pesquisa sem distinção entre maiúsculas e minúsculas -
--color=always
para forçar as cores mesmo quando tubulação atravésless
. Fazerless
cores de apoio, você precisa usar o-r
Opcao:grep -Hrn search . | less -r
-
--exclude-dir=dir
útil para excluir diretórios como.svn
e.git
.
Eu acredito que você pode usar algo assim:
find /path -type f -exec grep -l "string" {} \;
Explicação dos comentários
find
é um comando que permite encontrar arquivos e outros objetos, como diretórios e links em subdiretórios de um determinado caminho. Se você não especificar uma máscara que os nomes de arquivos devem atender, ela enumera todos os objetos de diretório.
-
-type f
especifica que ele deve processar apenas arquivos, não diretórios etc. -
-exec grep
especifica que para cada arquivo encontrado, ele deve executar o comando grep, passando seu nome de arquivo como um argumento para ele, substituindo{}
com o nome do arquivo
Meu comando padrão é
grep -Rin string *
Eu uso um Capitólio ' R ' porque ls
usa-o para recursivo. Como o grep aceita ambos, não há razão para não usá-lo.
Editar: por HVNSweeting, aparentemente -R
seguirá links simbólicos onde como -r
não vai.
Se você está disposto a tentar algo novo, Dê ack
fotografo. O comando para pesquisar recursivamente o diretório atual para string
e:
ack string
A instalação é bastante simples:
curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3
(Desde que você já tenha o diretório ~/bin
e é de preferência em seu PATH
.)
O comando rgrep é dedicado para tal necessidade
Se não estiver disponível, você pode obtê-lo assim
mkdir -p ~/bincd ~/binwget http://sdjf.esmartdesign.com/files/rgrepchmod +x rgrep
Você pode definir diretamente em suas opções grep padrão, conforme descrito acima.
Eu uso pessoalmente
[[ ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"args="${args:--Hns} --color=auto"
topico : como sempre usar rgrep com cor
Atualização 2:
Esta linha de comandos usando find
e grep
corrige o problema:
$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +
--color=<always or auto>
para saída colorida:
$ find path_to_search_in -type f \ -exec grep --color=always -in searchString {} 2>/dev/null +
Exemplo:
$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +
Um exemplo é executado no instantâneo abaixo:
Atualização 1:
Você pode tentar seguir o código; como uma função em seu .bashrc
ou .bash_aliases
ou em um script:
wherein () { for i in $(find "$1" -type f 2> /dev/null); do if grep --color=auto -i "$2" "$i" 2> /dev/null; then echo -e "\033[0;32mFound in: $i \033[0m\n"; fi; done}
Uso: wherein /path/to/search/in/ searchkeyword
exemplo:
$ wherein ~/Documents/ "hello world"
(Nota: como sugerido nos comentários abaixo por @enzotib, isso não funciona com arquivos/diretórios, incluindo espaços em seus nomes.)
Original post
Para procurar a string e produzir apenas essa linha com a string de pesquisa:
$ for i in $(find /path/of/target/directory -type f); do \ grep -i "the string to look for" "$i"; done
como.:
$ for i in $(find /usr/share/applications -type f); \ do grep -i "web browser" "$i"; done
Para exibir o nome do arquivo contendo a string de pesquisa:
$ for i in $(find /path/of/target/directory -type f); do \ if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;
como.:
$ for i in $(find /usr/share/applications -type f); \ do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \ fi; done;
grep
(GNU ou BSD)
Você pode usar grep
ferramenta para pesquisar recursivamente a pasta atual com -r
parâmetro, como:
grep -r "pattern" .
Notar: -r
- Procurar recursivamente subdiretórios.
Para pesquisar em arquivos específicos, você pode usar um sintaxe globbing como:
grep "class foo" **/*.c
Nota: usando opção de globbing (**
), ele verifica todos os arquivos recursivamente com extensão ou padrão específico. Para habilitar essa sintaxe, execute: shopt -s globstar
. Você também pode usar **/*.*
para todos os arquivos (excluindo ocultos e sem extensão) ou qualquer outro padrão.
Se você tiver o erro de que seu argumento é muito longo, considere restringir sua pesquisa ou usar find
sintaxe em vez disso, como:
find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'
Como alternativa, use ripgrep
.
ripgrep
Se você está trabalhando em projetos maiores ou arquivos grandes, você deve usar ripgrep
em vez disso, como:
rg "pattern" .
Verifique os documentos, etapas de instalação ou código-fonte no Página do projeto GitHub.
É muito mais rápido do que qualquer outra ferramenta como GNU/BSD grep
, ucg
, ag
, sift
, ack
, pt
ou similar, uma vez que é construído em cima de Motor regex da Rust que usa autômatos finitos, SIMD e otimizações literais agressivas para tornar a pesquisa muito rápida.
Ele suporta ignorar padrões especificados em .gitignore
arquivos, portanto, um único caminho de arquivo pode ser combinado com vários padrões glob simultaneamente.
Você pode usar os parâmetros comuns, como:
-
-i
- Busca insensível. -
-I
- Ignore os arquivos binários. -
-w
- Procure as palavras inteiras (em frente à correspondência parcial de palavras). -
-n
- Mostre a linha do seu par. -
-C
/--context
(como.-C5
)- Aumenta o contexto, então você vê o código circundante . -
--color=auto
- Marque o texto correspondente. -
-H
- Exibe o nome do arquivo onde o texto é encontrado. -
-c
- Exibe a contagem de linhas correspondentes. Pode ser combinado com-H
.
Eu faço isso usando xargs, um comando muito subestimado
find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'
encontrar ./ fornece uma lista recursiva de todos os arquivos em uma pasta atualentão você canaliza para xargs que executa o comando grep em cada um desses arquivos
Eu sei que há muitas respostas aqui, mas aqui está uma alternativa se você quiser adicionar outras restrições ao pesquisar os arquivos:
find . -type f -exec grep --quiet string_to_look_for {} ';' -print
Isso funciona porque grep
retornará 0 se encontrar um resultado, 1 caso contrário. Por exemplo, você pode encontrar arquivos 1 MB grande e contendo algo:
find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print
Para vários requisitos, você provavelmente deseja usar o sinalizador otimizador -O
isso existe no GNU grep.
Curinga com ’ – include="*.C "’ opção, @ user311346, graças a @ Lekensteyn.
grep-Rin < yor pattern> * irá pesquisar a partir de diretórios atuais para baixo em todos os arquivos de texto.
Não tenho certeza de como fazer minha pesquisa recursivamente em padrões de arquivo como *.C com apenas grep
Use a combinação find e grep para pesquisar recursivamente arquivos por uma string nos diretórios current e all sub. Verifique isto http://wilddiary.com/find-files-containing-my-text/