O comando find é muitíssimo poderoso, mais flexível e rápido do qualquer front-end.
Podemos usar uma série de parâmetros e opções para realizar buscas.
Exemplos de buscas com o find
O comando abaixo exibe arquivos modificados a mais de 7 dias (somente o nome e data)
find ~/ -mtime +7 -printf "%f %AD\n"
Arquivos criados a menos de dez minutos e "-and -a" com extensão txt
find ~/ -cmin -10 -a -iname *.txt
find ~/ -size +500M
find ~ -size +10000 -a -iname *.pdf
arquivos com exatamente 1000 caracteres
find . -size 1000c
Arquivos entre 599 e 701 caracteres
find . -size +599c -and -size -701c
Buscando em dois diretórios htdocs e cfi-bin
find htdocs cgi-bin -name "*.cgi" -type f -exec chmod 755 {} ;
Contar quantos txt há em minha pasta pessoal "~/" (combinando com o comando wc)
find ~/ -iname *.txt | wc -l
Mostra todos os arquivos pdf que não sejam maiores que 2000 bytes
tudo que estiver após a exclamação será negado.
find ~/ -iname *.pdf ! -size +2000
Invertendo a lógica do comando acima no primeiro caso tirando a exclamação, no segundo invertendo o sinal de + para menos, veja:
find ~/ -iname *.pdf -size +2000
ou
find ~/ -iname *.pdf ! -size -2000
Procura pdf's de tamanho maiores que 2000 bytes e mostra somente o nome sem o caminho "basename"
find ~/ -iname *.pdf -a -size +2000 -exec basename {} ;
Procurar por arquivos de um usuário especifico
find / -user sergio
find . -user root
Busca com opções. No caso arquivos html ou htm
find ~/ ( -name *.htm -o -name *.html ) -atime +5
find ~/ -iregex '.*html?' -atime +5
**Observações importantes** mudar permissão somente em diretórios "-d"
find . -type d -exec chmod 755 {} ;
Note: chmod -R 755 ./* também aplica a modificação mas também pega arquivos
!!Usando o find com o xargs
Usando o parâmetro -exec ele executa cada vez que acha o arquivo, repassando via pipe "|" para o comando xargs o find faz primeiro as buscas tornando-se mais rápido.
find ~/ -type f -print | xargs rm -rf
Procure no diretório atual "." arquivos "f" imprima a lista "-print" filtre com o egrep ignorando maiúsculas e minúsculas "i" a "expressao".
find . -type f -print | xargs egrep -i "expressao"
Encontrando arquivos que não contenham extensão .c ou .o
find ~/docs -type f | egrep -v '.[oc]'
Qual a diferenca entre os comandos abaixo?
% find . -user queiroz -exec ls {} ;
% find . -user queiroz -print | xargs ls
A diferenca e que no primeiro find o comando ls e executado uma vez para cada arquivo encontrado. Se forem encontrados 1000 arquivos o comando ls sera executado 1000 vezes.
Ja no segundo exemplo, com a saida do find redirecionada para o comando xargs, o comando ls sera executado sobre um grupo de arquivos de cada vez e nao uma vez para cada arquivo. O que ira determinar o numero de vezes que o comando xargs executara o comando ls e justamente o tamanho da linha de comandos. O comando xargs ira dividir a saida gerada pelo comando find em blocos compativeis com a capacidade do sistema de maneira a que nao ocorra um erro quando da execucao, em nosso caso, do comando ls.
Em outras palavras, suponhamos que o comando find descubra 2000 arquivos sobre os quais o comando xargs devera executar o comando ls. O limite maximo de arquivo sobre os quais o comando ls pode atuare de 500. O comando xargs automaticamente realizara a divisao desta entrada em quatro blocos de 500 arquivos.
Concluindo, o comando xargs e bem mais eficiente do que a diretiva -exec do comando find, por exigir menos recursos computacionais para executar a mesma tarefa. uma vez sobre todos os arquivos encontrados.
Veja o comando abaixo (ainda não testado) procure em /tmp arquivos com tempo de acesso superior a sete dias "-atime +7" e "and" usuário corrente $USER, redirecione através do xargs para o comando de remoção "rm", sem fazer perguntas -f
find /tmp -atime +7 -type f -a -user $USER | xargs rm -rf
find /tmp -atime +7 -type f | xargs rm -f
Procura todos os arquivos suid e setgid executables:
find / ( -perm -4000 -o -perm -2000 ) -type f -exec ls -ldb {} ;
!!Redirecionando o erro padrão "2>/dev/null" para desviar as mensagens
de erro por acesso não root
find / -type f -name dummy 2>/dev/null
!!Parâmetros
-ctime
-mtime
-atime
-cmin
-amin
-mmin
-user
-nouser
-uid
-gruop
-gid
-and ou -a
-or ou -o
-size
-name
-iname
!!Usando ''printf''
O argumento -printf pode receber vários parâmetros
find ~/ -iname *.txt -printf %f\n "\n faz quebra de linha"
These are used the most:
%p imprime o nome do arquivo com o caminho
%m permissions of file, displayed in octal.
%f imprime o nome do arquivo sem o caminho
%g name of the group the file belongs to.
%G gid
%U uid
%h display name of directory file is in, filename isn't included.
%u username of the owner of the file
%c imrprime -ctime
%a tempo de acesso
%m imprime modo de permissão (formato octal)
%A(caractere) - devolve o "atime" (tempo de acesso)
%AD imprime a data tipo dia/mes/ano (data de acesso)
%AH imprime a hora
%AT /hh/mm/ss
%A+ data e tempo separados pro "+"
%Ax mm/dd/aaaa
find ~/ -iname *.txt -printf "%f %Ax %AT \n"
O comando acima exibe arquivos assim:
nome data hora
serii.txt 04-01-2007 12:42:07
%C(caractere) "ctime"
%T(caractere) "mtime"
Um último exemplo
find . -iname *.txt -printf "%p %m %AA %Ad de %AB de %AY %AX\n" isto retorna algo como:
/caminho/leia-me.txt 644 sexta 23 de junho de 2006 10:30:53
Para imprimir o nome do arquivo com o modo de permissão octal use
find ~ -iname *.txt -printf "%p %m\n"
acrescentando o parâmetro %a retorna o ultimo acesso de acordo com "-ctime"
find ~ -iname *.txt -printf "%p %a %m\n"
printf com os parâmetros "%p %m %Ax\n" retorna algo como
/caminho/leia-me.txt 644 23/06/06
printf com os parâmetros "%p %m %g %u %Ax\n" retorna algo como
/caminho/leia-me.txt usuario grupo 644 23/06/06
-printf "%f %u %g %m %Ax %AX\n" veja detalhes abaixo
%f nome sem o caminho
%u usuário
%g grupo
%m modo de permissão
%Ax dada de acesso no modo dd/mm/aa
%AX hora de acesso do tipo 18:15:23
\n quebra de linha
!!Usando Expressões regulares
$ find . -regex './ch0[1-2]_0[1-3].*'
./ch01_01.html
./ch01_02.html
./ch02_01.html
./ch02_02.html
./ch02_03.html
How do I search for files, then do something with the result?
* Find all .conf files, then search through them to see if they contain any IP addresses, then print the filename, line number and the line containing the address
find /etc -name *.conf -exec grep -Hn '[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*' {} ;
!Fazendo um backup
tar -zcvf ultimamod.tar.gz `find . -mtime -1 -type f -print`
!Outros exemplos
Localizar todos os arquivos do tipo txt gerados nos últimos 20 minutos, menos os cookies do navegador, que são cosntantemente gerados e não devem ser buscados
find ~/ -iname *.txt -cmin -20 | grep -v "cookies"
Usando expressões regulares
find . -regex './ch0[1-2]_0[1-3].*'
./ch01_01.html
./ch01_02.html
./ch02_01.html
./ch02_02.html
./ch02_03.html
Limpando miniaturas de imagens no nautilus
find ~/.thumbnails -type f -atime +7 -exec rm {} ;
Referências
http://www.zago.eti.br/find.html
http://www.tldp.org/LDP/abs/html/index.html
http://www.absoluta.org/
http://www.linux.ie/newusers/beginners-linux-guide/find.php
http://www.oreilly.de/catalog/unixcd/chapter/c02_077.htm
http://www.mattwalsh.com/twiki/bin/view/Main/UsingTheFindCommand
manual do find "man find"
Comments (0)
You don't have permission to comment on this page.