07 janeiro 2008

A arte da procura em Linux

Quantas vezes já não tiveste que procurar por aquele ficheiro de configuração, ou por aquele cartoon que guardaste sabes lá onde, e que teimam em se esconder nas pastas mais obscuras do teu sistema? Primeiro começas por ir àquelas pastas do costume, mas é claro que não vais encontrar nada. Lá tens de recorrer ao Beagle ou ao Google Desktop para encontrar o material. Mas ter que ter um destes programas a correr no teu sistema, acaba por se tornar um pouco incomodativo. Pequenas paragens ou respostas mais lentas enquanto trabalhas com o mail ou com outro programa, os indexes a crescerem e facilmente atingirem mais de 1 Giga de espaço na tua /home, o receio que o Big Brother sediado na Google esteja a olhar para as tuas coisas.


E porque não usar as excelentes ferramentas que o GNU/Linux te disponibiliza à distancia duma teclada? O comando "ls" é um bom ponto de partida:

$ ls *tux*

e lista-te todos os ficheiros que tenham "tux" no seu nome. Ou então:

$ ls */*tux*

e vai-te listar todos os ficheiros que tenham "tux" no seu nome, nas subdirectorias da corrente pasta. E podes refinar melhor a procura usando algo como:

$ ls *tux* */*tux* */*/*tux*

Mas se quiseres procurar em todo o sistema de ficheiros por um ficheiro, a solução já é o "slocate":

$ slocate tux

e procurar-te-á por todos os ficheiros que tenham o "tux" no seu nome. E este comando é rápido porque usa um index de nomes. Esse index é criado pelo "updatedb" que normalmente é executado uma vez por dia pelo "cron" ou o "anacron" e o index fica localizado, no caso do Ubuntu, na /var/lib/slocate/slocate.db. O único contra do "slocate" é que ele não encontrará ficheiros que tenham sido criados após o "updatedb" ter sido executado. A letra "s" do "slocate" é de "secure" e o "updatedb" tem de ser executado com previlégios de root o que garante que irá ver todos os ficheiros.

Mas há mais ferramentas, e mais especializadas. O "whereis" procura por ficheiros executáveis, códigos fonte e documentação (man pages). Ele procura em pastas pré-determinadas por isso a seleção na procura. Exemplo.

$ whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.gz

Ou seja, diz-nos onde está o executável (binário) e o manual dele. O comando "which" ainda é mais especializado, pois procura por um binário específico dando como resultado o primeiro resultado que encontra:

$ which eog
/usr/bin/eog

Tentando explicar melhor comando "which" acima, ele responde a perguntas como esta: "Se eu der o comando "eog", onde está o programa que irá ser executado?"

E chegamos à nata dos programas de busca, o "find". Com este comando podemos localizar qualquer ficheiro pelo dono, permissões de acesso, pelo último acesso, tamanho, e muito mais! Só que toda esta flexibilidade paga-se em complexidade de utilização, mas também não é nada do outro mundo. Um exemplo:

$ find /etc -name '*.conf' -user cupsys -print
find: /etc/ssl/private: Permission denied
find: /etc/cups/ssl: Permission denied
/etc/cups/cupsd.conf
/etc/cups/printers.conf

Neste exemplo, fez-se uma procura na pasta /etc por ficheiros de configuração *.conf e pertençam ao utilizador cupsys (sistema de impressão). A opção "-print" irá fazer com que o resultado da busca seja imprimido na consola, mas se não estiver nenhuma opção de output, o "find" assume o "print" por omissão. Basicamente o "find" funciona da seguinte forma:
find (onde procurar) (o que procurar) (o que fazer com a procura).
Exemplos:

1- Procurar por aqueles ficheiros .ppt de arte nua, na nossa querida /home:
$ find ~ -name '*.ppt'

2- Procurar na pasta /var por pastas ou directorias E que pertençam ao daemon:
$ find /var -type d -user daemon

3- Procurar na pasta /etc por ficheiros que pertençam à conta cupsys OU estejam vazios:
$ find /etc -user cupsys -or -size 0

4- Procurar por ficheiros na pasta /bin que NÃO pertençam ao root:
$ find /usr/bin ! -user root

5- Procurar por ficheiros na nossa querida /home, que tenham sido modificados à menos de 10 minutos, à mais de um ano e à exactamente 4 dias (o sinal + antes do número significa "mais de...", se for o sinal - já significa "menos de ...", mas se não houver sinal + ou -, o "find" procurará exactamente esse número):
$ find ~ -mmin -10
$ find ~ -mtime +365
$ find ~ -mtime 4

6- Procurar por ficheiros na nossa valiosa /home que tenham a característica de ter as permissões 644 (num ls -l seria algo como: rw-r--r--):
$ find ~ -perm 644

7- Usando outra opção de output que não a impressão do resultado. Neste exemplo, o resultado da busca é movido para uma pasta de backup. De notar que o ";" é para assinalar o fim do comando que precede o -exec.
$ find ~ -mtime +365 -exec mv {} /tmp/meubackup \;

Além -print e do -exec ;, também se pode usar o -ls ou o -delete, no output do comando "find".


Tudo isto foram exemplos de como achar ficheiros da mais variada forma no sistema, mas para procurar dentro no conteúdo dos ficheiros? É aí que entra o famoso "grep". Um exemplo onde se procura por ficheiros que contenham a string "Tux" nessa pasta e num nível abaixo dela (*/*) :

$ grep -l Tux */*
Apanhados/HIV .jpg
Apanhados/wtc-photo.jpg
grep: backup/lost+found: Permission denied
Blogs/old.txt
Blogs/old.txt.save
Imagens/gnome_erro.ogg
...

Ainda mais selectivo na procura, agora só em ficheiros .txt:

$ grep -l Tux *.txt
nautilus-debug-log.txt

E para procuras mais precisas, juntam-se os comandos "find" e "grep". Neste exemplo, procura-se na nossa amada /home por ficheiros cujo nome terminem em .txt e que contenham a string "Tux":

$ find ~ -name '*.txt' -exec grep -q Vermelho {} \; -print



Concluo com um Boas procuras!!


Fonte: Linux Format

7 comentários:

Tutorial porreiro.

Cumprimentos e bom Ano Novo ;-)

Mt bom :-)

Caro Tuxer, apenas uma dicas do Júlio César Neves quanto ao uso do find com exec, segundo ele o find combinado com
xargs é mais eficiente, veja:

http://www.dicas-l.com.br/dicas-l/20050226.php

Clap! Clap! Clap!
Já gravei nos bookmarks.
Obrigado.

Ainda me deu trabalho a fazer este tutorial, por isso mais contente fico pelos agradecimentos...

Excelente material :)
Quando tiver uma pequena vaga, tenho que fazer referencia o meu blog a este teu artigo.
1abraçol

Como somos todos preguiçosos e não lemos o manual, este tutorial dá muito jeito.