FIND, muito mais que um "procurador de arquivos
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 sinaxe do chown é:
chown [opcoes] <dono>:<grupo> <arquivo>
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.
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
Fonte: www.dicas-l.com.br