quarta-feira, 10 de outubro de 2012

Procurando arquivos com Find

Depois de um mes de férias, volto a escrever no blog. Agora vou falar do find, uma ferramenta muito útil para procurar arquivos pela linha de comando. Melhor que explicá-lo é ver alguns exemplos de sua utilização.

Para listar todos os ítens da pasta /home/ricardo cujo nome contenha 2012 e a extenção .txt, use:

$ find /home/ricardo -name *2012*.txt
/home/ricardo/tmp/20120101.txt
/home/ricardo/ProgramasRFB/IRPF2012/TryLock2012.txt
/home/ricardo/Documentos/Documentacao/Outros/Compensacao_2012.txt
/home/ricardo/Documentos/Documentacao/Feitos/Feitos_2012.txt

Para encontrar o ítens da pasta /home/ricardo/Documentos modificados a menos de 3 dias e a mais de 1 dia, digite:

$ find /home/ricardo/Documentos/ -mtime -3 -mtime +1
/home/ricardo/Documentos/Contas
/home/ricardo/Documentos/Contas/Cartao_Credicard_20121008.pdf
/home/ricardo/Documentos/Contas/Bateria_celular.pdf

Para listar os ítens da pasta /home/ricardo que foram acessados a menos de 2 minutos, digite:

$ find /home/ricardo/ -amin -2
/home/ricardo/.config/chromium/Local State
/home/ricardo/.mozilla/firefox/ht1sguqp.default/sessionstore.js
/home/ricardo/.purple/certificates/x509/tls_peers/api.twitter.com
/home/ricardo/.purple/blist.xml
/home/ricardo/.gconfd/saved_state

Listando arquivos (apenas arquivos, sem pastas, links simbólicos, etc) da pasta /home/ricardo que foram acessados a menos de 1 minutos:

$ find /home/ricardo -amin -1 -type f
/home/ricardo/.mozilla/firefox/ht1sguqp.default/sessionstore.js
/home/ricardo/.mozilla/firefox/ht1sguqp.default/places.sqlite
/home/ricardo/.mozilla/firefox/ht1sguqp.default/places.sqlite-journal
/home/ricardo/.mozilla/firefox/ht1sguqp.default/Cache/0FB71300d01
/home/ricardo/.mozilla/firefox/ht1sguqp.default/Cache/AD773ACBd01
/home/ricardo/.mozilla/firefox/ht1sguqp.default/Cache/0F955364d01
/home/ricardo/.mozilla/firefox/ht1sguqp.default/Cache/8F923340d01
/home/ricardo/.purple/certificates/x509/tls_peers/api.twitter.com
/home/ricardo/.purple/blist.xml
/home/ricardo/.gconfd/saved_state
/home/ricardo/.evolution/mail/local/Noticias
/home/ricardo/.evolution/mail/local/folders.db
/home/ricardo/.evolution/mail/config/state

É possível executar um comando para cada objeto encontrado (por exemplo, para compactar arquivos antigos). No exemplo abaixo, executo o comando stat em cada arquivo da pasta /home/ricardo/tmp que tenha sido criado e menos de 1 dia.

$ find /home/ricardo/tmp -ctime -1 -type f -exec stat {} \;
  File: "/home/ricardo/tmp/20120101.txt"
  Size: 104       Blocks: 8          IO Block: 4096   arquivo comum
Device: 801h/2049d Inode: 655384      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/ ricardo)   Gid: ( 1000/ ricardo)
Access: 2012-10-10 14:20:21.877216007 -0300
Modify: 2012-10-10 14:20:21.877216007 -0300
Change: 2012-10-10 14:20:21.877216007 -0300
  File: "/home/ricardo/tmp/20120101.txt~"
  Size: 62         Blocks: 8          IO Block: 4096   arquivo comum
Device: 801h/2049d Inode: 655401      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/ ricardo)   Gid: ( 1000/ ricardo)
Access: 2012-10-10 14:20:21.877216007 -0300
Modify: 2012-10-10 14:20:21.877216007 -0300
Change: 2012-10-10 14:20:21.877216007 -0300

Para mover esses mesmos arquivos para a pasta /tmp, use:

$ find /home/ricardo/tmp -ctime -1 -type f -exec mv {} /tmp \;

O comando mv será executado para cada arquivo encontrado, e o {} será substituído pelo nome do arquivo no comando em questão.

Para apagar os arquivos criado a mais de 1 mes na área pública do servidor, digite:

$ find /home/temporario -ctime +31 -type f -exec rm -f {} \;

ou

$ find /home/temporario -ctime +31 -type f -delete

Também é possível encontrar os arquivos que possuem o atributo suid. No exemplo abaixo, listamos os arquivos da pasta /bin e executamos um ls -l em cada um.

$ find /bin -perm /+s -exec ls -l {} \;
-rwsr-xr-x 1 root root 31360 Out 14  2010 /bin/ping
-rwsr-xr-x 1 root root 47304 Jan 25  2011 /bin/umount
-rwsr-xr-x 1 root root 35252 Out 14  2010 /bin/ping6
-rwsr-xr-x 1 root root 29152 Fev 15  2011 /bin/su
-rwsr-xr-x 1 root root 68316 Jan 25  2011 /bin/mount

Para mais detalhes sobre o find, use o man.

$ man find

É bem provável que o comando find já faça parte de todas as distribuições Linux.