Como posso executar grep em arquivos ocultos?

96

Estou pesquisando em um repositório Git e gostaria de incluir a .gitpasta.

grep não inclui esta pasta se eu executar

grep -r search *

O que seria um comando grep para incluir esta pasta?

Steven Penny
fonte

Respostas:

135

Consulte a solução no final desta postagem como uma alternativa melhor para o que você está fazendo.

Você pode incluir explicitamente arquivos ocultos (um diretório também é um arquivo).

grep -r search * .*

O *irá corresponder a todos os arquivos, exceto os ocultos e .*irá corresponder apenas aos arquivos ocultos. No entanto, isso falhará se não houver arquivos não ocultos ou arquivos ocultos em um determinado diretório. Você pode, é claro, adicionar explicitamente em .gitvez de .*.

No entanto, se você simplesmente deseja pesquisar em um determinado diretório, faça assim:

grep -r search .

O .corresponderá ao caminho atual, que incluirá arquivos ocultos e não ocultos.

bitmask
fonte
1
A primeira abordagem (grep -r search *. *) Funcionou para mim. A segunda abordagem (grep -r search.) Não encontrou a string. Encontrei resultados semelhantes ao omitir o "-r" e pesquisar apenas no diretório de nível superior. Estou usando o GNU grep 2.6.3.
Alan
@Alan: Isso é estranho. Eu uso isso regularmente. Você tentou no mesmo diretório?
bitmask de
27
usando .*incluirá o diretório pai (porque ..corresponde)
ver
1
É seguro generalizar sobre essa solução, já que o comportamento pode variar entre os shells?
Astletron de
6
para a primeira versão, você deve adicionar --exclude-dir = .. para evitar a pesquisa nas pastas pai
user762353
12

Acabei de encontrar esse problema e, com base na resposta de @ bitmask, aqui está minha modificação simples para evitar o problema apontado por @sehe:

grep -r search_string * .[^.]*
insano
fonte
Não obtenho nenhum resultado usando isso: o sudo grep -r ANDROID_HOME * .[^.]*que estou fazendo de errado aqui?
messerbill
@messerbill onde você está fazendo a pesquisa?
insaner
3

Talvez você prefira combinar "grep" com o comando "find" para obter uma solução completa como:

find . -exec grep -Hn search {} \;

Este comando pesquisará dentro de arquivos ou diretórios ocultos pela string "search" e listará quaisquer arquivos que coincidam com este formato de saída:

Caminho do arquivo: Número da linha: linha com coincidência

./foo/bar:42:search line
./foo/.bar:42:search line
./.foo/bar:42:search line
./.foo/.bar:42:search line
Olvathar
fonte
2

Você pode querer usar essa abordagem, supondo que esteja pesquisando o diretório atual (caso contrário, substitua. Pelo diretório desejado):

find . -type f | xargs grep search

ou se você deseja apenas pesquisar no nível superior (que é mais rápido de testar se você estiver tentando fazer isso):

find . -type f -maxdepth 1 | xargs grep search

ATUALIZAÇÃO: modifiquei os exemplos em resposta aos comentários de Scott. Eu também adicionei "-tipo f".

Alan
fonte
1
(1)  ~é o diretório inicial do usuário. A pergunta não era sobre o diretório pessoal do usuário, portanto, a resposta não deve ser mencionada  ~. (2) Em um  findcomando, -name '*'é um ambiente autônomo (ou seja, não tem nenhum propósito).
Scott
1

Para pesquisar APENAS todos os arquivos e diretórios ocultos de sua localização atual:

find . -name ".*" -exec grep -rs search {} \;

SOMENTE todos os arquivos ocultos:

find . -name ".*" -type f -exec grep -s search {} \;

SOMENTE todos os diretórios ocultos:

find . -name ".*" -type d -exec grep -rs search {} \;
Tyler Christian
fonte
1

Todas as outras respostas são melhores. Este pode ser fácil de lembrar:

find . -type f | xargs grep search

Ele encontra apenas arquivos (incluindo ocultos) e executa greps em cada arquivo.

PrashantB
fonte
0

Para localizar apenas em uma determinada pasta, você pode usar:

ls -al | grep " \."

É um comando muito simples de listar e canalizar para grep.

Peter Mortensen
fonte
0

Além da sugestão de Tyler, aqui está o comando para executar grep em todos os arquivos e pastas recursivamente, incluindo arquivos ocultos

find . -name "*.*" -exec grep -li 'search' {} \;
nikhilgoel1985
fonte
0

Para evitar correspondência .e ..que não são arquivos ocultos, você pode usar grepcom ls -Acomo neste exemplo:

ls -A | grep "^\."

^\. afirma que o primeiro caractere deve ser .

A opção -Aou --almost-allexclui os resultados .e, ..portanto, apenas os arquivos e diretórios ocultos são correspondidos.

mchid
fonte
0

Você também pode pesquisar tipos específicos de arquivos ocultos, como arquivos de diretórios ocultos:

grep -r --include=*.directory "search-string"

Isso pode funcionar melhor do que algumas das outras opções. As outras opções que funcionaram podem ser muito lentas.

mYnDstrEAm
fonte