De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
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.
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? É ofind, 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(dofind) se esgote.Exemplo
Estou no meu diretório home, e crio um diretório chamado
teste.$ mkdir testeAgora, 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.tgzno meuhome(por algum motivo qualquer..hehehhe), e apenas os menores que 10K eu colocarei dentro do diretórioteste.....como farei?$ find . -name "*.tgz" -size -10k -exec cp {} teste/ \;Explicação
O parametro -name
*tgzirá filtrar qualquer arquivo que tenha a extensãotgze possua qualquer nome.O parametro
-size -10k, ira procurar por qualquer arquivo MENOR QUE 10kDentro do
size, podemos colocar-size +10Mpor exemplo, que ele fará a busca em arquivos maiores que 10Megabites....Depende da sua necessidade.
Agora sim, o
-execBom, como eu havia dito, o
-execirá executar um comando específico, para cada um dos itens encontrados pelofind(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 dofind.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.
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í ;)