Como usar o grep em todos os arquivos de forma não recursiva em um diretório?

10

Eu quero procurar uma string de texto em todos os arquivos em um diretório (e não em seus subdiretórios; eu sei que a opção -r faz isso, mas não é isso que eu quero).

  1. Rodando

    grep "string" /path/to/dir
    

    é suposto ser capaz de fazer isso, eu li, mas isso me dá o erro:

    grep: dir: é um diretório

  2. Em seguida, tentei executar grep em vários arquivos.

    grep "string" .bashrc .bash_aliases funciona perfeitamente.

    grep "string" .bash* funciona como pretendido também.

    grep "string" * me dá os erros:

    grep: data: Is a directory
    grep: Desktop: Is a directory
    grep: Documents: Is a directory
    grep: Downloads: Is a directory
    ...
    

Apenas os erros são impressos, não consigo as linhas correspondentes. Eu tentei usar a opção -s , mas sem sucesso.

Então, minhas perguntas:

  1. Por que não estou conseguindo usar grep em um diretório, como em (1), quando eu deveria conseguir? Eu vi isso feito em muitos exemplos na Internet.
    Editar : Quando eu digo "usando grep em um diretório", quero dizer "pesquisa em todos os arquivos nesse diretório excluindo seus subdiretórios ". Eu acredito que é isso que o grep faz quando você passa um diretório para ele no lugar de um arquivo. Estou incorreto?

  2. Por favor, dê-me uma explicação sobre o funcionamento de grep que explicaria o comportamento dos comandos em (2).
    Editar : Deixe-me ser mais específico. Por que usar curingas para especificar vários arquivos para pesquisar trabalho com .bash* e não com * ou mesmo ./* ?

  3. Como posso pesquisar todos os arquivos em um diretório (e não em seus subdiretórios) usando grep ?

por John Red 25.05.2016 / 18:07

4 respostas

18

No Bash, um glob não será expandido para arquivos ocultos, portanto, se você quiser pesquisar all os arquivos em um diretório, será necessário especificar os arquivos ocultos .* e não oculto * .

Para evitar os erros "É um diretório", você pode usar -d skip , mas no meu sistema também recebo um erro grep: .gvfs: Permission denied , então sugiro usar -s , que oculta todas as mensagens de erro.

Então o comando que você está procurando é:

grep -s "string" * .*

Se você estiver pesquisando arquivos em outro diretório:

grep -s "string" /path/to/dir/{*,.*}

Outra opção é usar a opção dotglob shell, que fará com que um glob inclua arquivos ocultos.

shopt -s dotglob
grep -s "string" *

Para arquivos em outro diretório:

grep -s "string" /path/to/dir/*
    
por wjandrea 25.05.2016 / 20:53
7

Você precisa da opção -d skip adicionada.

  1. O Grep está pesquisando dentro de arquivos. Você pode pesquisar recursivamente, como você disse, se quiser pesquisar arquivos dentro de um diretório.

  2. Por padrão, o grep lerá todos os arquivos e detectará os diretórios. Como, por padrão, você não definiu o que fazer com os diretórios com a opção -d , ele gera uma saída de erro.

  3. A pesquisa apenas dentro do diretório pai seria 'grep -d skip "string" ./*

por anonymous2 25.05.2016 / 18:13
6

Os veteranos antigos provavelmente fariam isso:

find . -type f -print0 | xargs -0 grep "string"
    
por dathompson 26.05.2016 / 02:25
1

Reescrevendo - você deseja usar os arquivos em um nível de subdiretório, mas não pode reciclar todos os subdiretórios?

grep forthis  *  */*

Ou se você não quiser os arquivos no diretório atual

grep forthis  */*

Observe que isso não encontrará diretórios começando com um ponto.

grep forthis  .*/*    */*   

deve fazer esse trabalho.

Também há -maxdepth e -mindepth parâmetros de restrição disponíveis para o comando find .

    
por Criggie 26.05.2016 / 03:42

Tags