Busca textual em arquivos

October 25, 2009

[Warning: This post is a backup recovery from my previous Wordpress blog. All content was automatically converted accessing a MySQL database using a Python script (details). Mostly are in Portuguese but if you are interest I can translate to English. If you found any problem dont’t hesitate to contact me in comments.]

Como resolver o problema de arquivos com espao em branco na hora de fazer uma busca textual?

Qualquer uma das trs formas funciona:

   1. find PATH -iname FILTRO -exec grep -n PALAVRA '{}' \; -print
   2. find PATH -iname FILTRO -exec grep -n PALAVRA /dev/null '{}' \;
   3. find PATH -iname FILTRO -exec grep -Hn PALAVRA '{}' \;

Exemplo:

Vamos imaginar a seguinte hieraquia de pastas e arquivos:


De modo que o comando:

$ find . -iname "nome*"

Mostre todos os arquivos que comeam com "nome"


./c/c3/nome2 sobrenome2
./c/c3/nome1 sobrenome1
./b/b2/nome1 sobrenome1 final1
./b/b3/nome2 sobrenome2
./b/b1/nome1 sobrenome2 mais um pouco
./a/a3/nome1 sobrenome1
./a/a1/nome2 sobrenome3
./a/a1/nome sobrenome
./a/a1/nome1 sobrenome1

Para fazer a busca do algum texto dentro desses arquivos, poderiamos pensar algo como:

$ find . -iname "nome*" | xargs grep teste

Mas o espao em branco iria atrapalhar a interpretao dos arquivos...


grep: ./c/c3/nome2: No such file or directory
grep: sobrenome2: No such file or directory
grep: ./c/c3/nome1: No such file or directory
grep: sobrenome1: No such file or directory


(...)


grep: ./a/a1/nome1: No such file or directory
grep: sobrenome1: No such file or directory

Uma das solues est no prprio find:

$ find . -iname "nome*" -exec grep teste '{}' \;


teste 123

Contudo, importante saber o nmero da linha da ocorrncia e o nome do arquivo, logo:

find . -iname "nome*" -exec grep -n teste '{}' \; -print


1:teste 123
./c/c3/nome2 sobrenome2