você está aqui: Home  → Arquivo de Mensagens

find, muito mais que um "procurador de arquivos"

Colaboração: Nícolas Wildner

Data de Publicação: 26 de Setembro de 2007

Dentro do Linux, possuimos comandos que eu aprendi, e gosto de chamar de comandos "Coringas". Como assim?

chown = Comando onde eu mudo o Dono/grupo de um Diretório/Arquivo qualquer.

Ótimo. Dentro do Linux também possuimos um comando chamado chgrp que serve para mudar o grupo de uma arquivo/diretório qualquer.

Oras, se eu sei que a sintaxe do chown é:

$  chown [opcoes] : 

porque precisarei ter em mente 2 comandos decorados, quando 1 deles já me quebra o galho de uma forma monstruosa.

Através desta filosofia, resolvi escrever este artigo sobre o find

Muita gente subestima o find, colocando-o como um simples procurador de arquivos, ou utilizam-no apenas para filtrar os arquivos por tamanho e nome, quando na verdade, o find possui muito mais opções do que imaginamos.

Exemplos Simples:

Com o find, podemos procurar arquivos e filtrá-los por extensões, utilizando caracteres chamados de coringas no linux, como o *.

Caso eu queira procurar todos os arquivos de uma determinada extensão em um diretório, como eu faço:

$  find . -name "*.tgz"

Pronto, serão listados todos os arquivos com a extensão TGZ dentro do diretório que estou atualmente dentro(isso é definido pelo ponto[.]).

Beleza, mas caso eu queira copiar todos os aquivos da extensão .tgz de dentro de um diretório, utilizando o find? Como? É o find, com uma parametro chamado -exec.

O que é o -exec ?

É um argumento que, para todo o resultado encontrado pelo find, eu executo outro comando, onde passarei logo após o -exec {}.

Como?

Isto. Caso a busca de resultados do find, for verdadeira(TRUE), ele executará o comando escrito após o -exec tantas vezes quanto for necessário, até que o resultado da busca(do find) se esgote.

Exemplo

Estou no meu diretório home, e crio um diretório chamado teste.

$  mkdir teste

Agora, quero que, todos os arquivos de extensão .tgz, e que sejam menor que 10 Kilobites, sejam copiados para dentro deste diretório. Isso é algo que parece fácil, e que eu poderia fazer "na mão", mas suponhamos que eu tenha mais de 3.000 arquivos .tgz no meu home (por algum motivo qualquer..hehehhe), e apenas os menores que 10K eu colocarei dentro do diretório teste .....como farei?

$  find . -name "*.tgz" -size -10k -exec cp {} teste/ \;

Explicação

O parametro -name *tgz irá filtrar qualquer arquivo que tenha a extensão tgz e possua qualquer nome.

O parametro -size -10k, ira procurar por qualquer arquivo MENOR QUE 10k

Dentro do size, podemos colocar -size +10M por exemplo, que ele fará a busca em arquivos maiores que 10Megabites....

Depende da sua necessidade.

Agora sim, o -exec

Bom, como eu havia dito, o -exec irá executar um comando específico, para cada um dos itens encontrados pelo find(por isso o -exec é usado no final)

o -exec cp, irá copiar. Mas copiar o que?

Aí é que entram as chaves {}

Com as chaves {} eu digo, Copie TODO E QUALQUE RESULTADO, vindo do find.

Resumindo,

-exec cp {} teste/ \; 
-exec cp comando a ser executado
{} entrada do cp e SAÍDA do find
teste/ diretório de destino(um dos parametros do cp)
\; fecha o exec.

COPIE todo e qualquer resultado, vindo do find (os resultados do find serão todo e qualquer arquivo com extensão .tgz e menor que 10k), para dentro do diretório teste.

Facil não?

Podemos fazer backups com o find.

Exemplo

cd /
mkdir backup
find $HOME -name "*.doc" -exec cp{} /backup/ \;

Pronto.Todo e qualquer arquivo com extensão .doc será copiado para um diretório chamado /backup. A variável de ambiente $HOME é o meu atual diretório home, e isto cria uma flexibilidade, caso eu salve este comando em um script, e queira que vários usuários o utilizem =)

É isso aí ;)