![]() [ UNIX ] find O comando find tem como finalidade procura arquivos, satisfazendo determinadas condições. Para cada arquivo localizado, é possível executar uma operação. A sintaxe do find é: find diretório condições operação Onde: Diretório: é o nome do diretório inicial onde
o comando find deve começar a pesquisa. Condição:
é uma cadeia de caracteres que é usada para selecionar os
nomes dos arquivos que servirão para operação. Entenda-se
por operação a execução de um comando qualquer
do sistema.
Na sua forma mais básica podemos usar o comando find para montra uma lista de todos os arquivos e diretórios abaixo do diretório atual: (isso pode gerar uma lista muito grande) % find . -print
Para realizarmos uma busca apenas pelos arquivos da Perl (com sufixo .pl), devemos usar a condição -name antes da condição -print: % find . -name "*.pl" -print
Para localizar os arquivos que foram modificado nos últimos sete dias, podemos usar -mtime com o argumento -7: % find . -mtime -7 -name "*.pl" -print ./temp/busca.pl
Se usarmos apenas o número 7 (sem o hífen), reculperamos apenas os arquivos que foram modificados há exatamente sete dias atrás: % find . -mtime 7 -name
"*.pl" -print
Para localizar os arquivos nos quais não mexi por pelo menos 30 dias, usamos +30: % find . -mtime +30
"*.pl" -print
Para procurarmos por arquivos que contenham o padrão cp, nos diretórios /etc e /usr, podemos usar: % find /etc /usr -name "*cp*"
-print
Este tipo de pesquisa pode tomar muito tempo em um sistema ocupado. Para localizar uma lista de diretórios dentro do diretório /etc, podemos usar a condição -type com o valor d, como vimos na tabela acima: % find /etc -type d -print
Podemos obter mais informações sobre os diretórios usando a condição -exec, a codição -exec deve ser usada com { }, que será substituida pelo nome do arquivo com que combina e \; no final do comando, se você esquecer a \ o C shell interpreta o ; como o final do comando find outra opção é colocar o ; entre aspas duplas ";". Você também deve se certificar de que haja um espaço entre { } e a \;. O nome do arquivo selecionado é colocado no lugar de { } e depois o comando especificado é executado. % find /etc -type d -exec ls
-alp { } \;
Que tal remover os arquivos core mais antigos automaticamente, (isso se você não analisa seus core) % find . -name core -ctime +4 -exec /bin/rm -f { } \; O flag -f no rm e para remover sem pedir cofirmação. Bem, agora você quer reculper um arquivo que não lembra onde esta, muito menos o nome do danado, mas..... você lembra do conteúdo do arquivo. Entã, o que acontecerá se usarmos o find e fizermos o arqgumento -exec chamar grep para localizar arquivod que contenhasm um padrão especifico? % find / -type f -exec grep -i
remover { } \;
Então o que acontece... é que o find vai andar em todo o seu sistema de arquivos, lendo todos ao arquivos que puder atrás do padrão "remover", mas não vai trazer o que realmente queremos que é o nome dos arquivos. Vamos evoluir e colocar o flag -l com grep, de forma que o grep especifique apenas o nome do arquivo: % find / -type f -exec
grep -i -l remover { } \;
O problema do comando acima é que todas as vezes que o find encontrar um arquivo, ele vai chamar o grep, o que vai gastar muitos recursos do seu sistema (se ele encontra 700 arquivos vai executar grep 700 vezes), para evitar este desperdício de recursos devemos incluir um novo elemento ao nosso comando o xargs, com o xargs podemos ler a saída do find e construir chamadas para o grep, o xargs inclui a lista de nomes de arquivos no final do comando especificado, então grep será chamado seis ou sete vezes e em cada uma das chamadas ele pode verificar 100 ou 200 arquivos. % find / -type f -print
| xargs grep -i -l remover
A saida será a mesma, mas mais rápida devido ao menor número de chamadas ao comando grep. Agora que mudamos nosso comando e temos a condição -print, podemos tira o flag -l que coloca somente o nome do arquivo, assim temos: % find / -type f -print
| xargs grep -i remover
Agora você quer procura por dois padrões simutaneamente, vejamos como fazer isso: % find / \(-name "*.pl" -o
"*.c" \) -atime +5 -exec rm { } \;
% find /home -mtime -2 -size +100k
-exec ls -alp { } \;
% find / \(-name "*.pl" -o
\
Para localizar todos os arquivos do sistema com os bits setuid ou setgid ligados, use : % find / -type f -a \( -perm 0400 -o -perm 0200 \) -print Para identificar todos os arquivos com permisão de escrita universal, use: % find / -perm -2 -print Para identificar arquivos que não perntencem a nenhum usuário ou a nenhum grupo, use: % find / -nouser -o -nogroup -print
Referência :
http://www.absoluta.org ---oOo--- verdade@absoluta.org |