Procura recursivamente por uma string contendo espaços em branco

0

Eu quero procurar por "this table ..." no diretório /home/myuser recursivamente, ou seja, em todos os arquivos em /home/myuser e em todos os diretórios e subdiretórios sob /home/myuser .

O diretório

/home/myuser está definido para uma variável de ambiente: $MYUSR

A pesquisa deve ser insensível a maiúsculas e minúsculas, e deve fornecer o nome completo do caminho dos arquivos que contêm a string "this table ...".

Eu tento:

grep -R "this table..." $MYUSR

mas não tenho certeza se ele realmente pesquisa porque eu espero por um longo tempo e ele não retorna nenhum resultado e ele nunca termina.

Eu também quero saber como fazer a mesma pesquisa recursivamente no diretório em que estou, talvez como:

grep -R "this table..." .

Como faço isso?

    
por alwbtc 26.03.2012 / 15:47

2 respostas

2
  find $MYUSR -type f -print0 | xargs -0 -n 10 grep -i -l 'this table...'

As opções para find são

  • -type f - não queremos pesquisar diretórios (apenas arquivos neles), dispositivos etc
  • -print0 - queremos poder manipular nomes de arquivos contendo espaços

As opções para xargs são

  • -0 - Por causa de find -print0
  • -n 10 - Executa o grep em 10 arquivos por vez (útil quando não estiver usando o -l do grep)

As opções para o grep são

  • -i - ignorar maiúsculas e minúsculas
  • -l - apenas lista nomes de arquivos (nem todas as linhas correspondentes)
  • -f - trata os pontos na expressão de pesquisa como simples pontos.

Para iniciar no diretório atual, substitua $MYUSR por .

Atualização (um colega superusuário sugeriu find -type f -exec grep -i "this table..." + )

$ ls -1
2011
2011 East
2011 North
2011 South
2012


$ find -type f -exec grep -i 'this table...'
find: missing argument to '-exec'

$ find -type f -exec grep -i 'this table...' +
find: missing argument to '-exec'

$ find -type f -exec grep -i 'this table...' {} \;
this table... is heavy
THIS TABLE... is important
this table... is mine
this table... is all alike
this table... is twisty

Mas isso não é útil, você quer nomes de arquivos

$ find -type f -exec grep -i -l 'this table...' {} \;
./2011 East
./2011
./2011 North
./2011 South
./2012

OK, mas muitas vezes você também quer ver o conteúdo da linha correspondente

Se você quiser nomes de arquivos E conteúdo de linha correspondente, eu faço desta maneira:

$ find -type f -print0 | xargs -0 -n 10 grep -i 'this table...';
./2011 East:this table... is heavy
./2011:THIS TABLE... is important
./2011 North:this table... is mine
./2011 South:this table... is all alike
./2012:this table... is twisty

Mas sem "old skool" -print0 e -0 você terá uma bagunça

$ find -type f | xargs -n 10 grep -i 'this table...';
./2011:THIS TABLE... is important
grep: East: No such file or directory
./2011:THIS TABLE... is important
./2011:THIS TABLE... is important
grep: North: No such file or directory
./2011:THIS TABLE... is important
grep: South: No such file or directory
./2012:this table... is twisty
    
por 26.03.2012 / 15:50
2

Depende do tamanho do diretório e dos subdiretórios em que você pesquisa. Mas ack melhor se adapta às suas necessidades. Veja link

    
por 26.03.2012 / 15:50