Artigos > O Find não é um simples comando, é um camarada

O find é um comando GNU/Linux bastante flexível que nos possibilita localizar arquivos e/ou diretórios a partir de um path.

Super completo, o find possui vários parâmetros para filtrar/aperfeiçoar nossas buscas.

O comando é executado da seguinte forma:

Exemplo:

Neste exemplo, o find buscará no diretório e subdiretórios de /home todos arquivos e diretórios cujo owner seja o usuário “wil”.

A seguir, os principais parâmetros do find (ou aqueles que eu mais utilizo):

  • -name
  • -iname
  • -type
  • -maxdepth
  • -user
  • -perm
  • -amin
  • -cmin
  • -ctime
  • -mtime
  • -atime
  • -size
  • -not e !
  • -exec

Vejamos alguns exemplos de find utilizando cada um desses parâmetros.

Exemplo 1 – Find sem parâmetros

Primeiramente, vamos utilizar o find sem passar parâmetros. Quando fazemos isso, o find nos retorna todos arquivos e diretórios existentes no path informado (e se não informamos um path, ele pega o path atual). Isso por que não especifico nenhum outro parâmetro de filtro para essa busca, de forma que tudo ali existente nos será exibido.

Exemplo 2 – Pesquisando um arquivo chamado xuxublza.jpg

Reaproveitando Exemplo 1, acrescento agora o parâmetro “-name” e passo o nome de arquivo que desejo localizar:

Se acaso não souber a extensão do arquivo, podemos substituir o “jpg” deste exemplo pelo caractere * (asterísco).

Observe que, com isso, posso buscar um arquivo e obter uma gama bem maior de resultados, pois além do .jpg, pode existir o .png, o .gif e assim por diante.

Ainda sobre o caractere * (asterísco), podemos utilizá-lo dentro do que seria o nome que estamos pesquisando. Por exemplo:

Neste caso, nos será exibido tudo que contiver “blza” em parte do seu nome e independete da sua extensão, pois após o caracter . (ponto) usei outro *.

Exemplo 3 – Pesquisando todos arquivos independentemente do case.

Assim como o parâmetro “-name”, podemos usar o “-iname” para localizar arquivos e diretórios. A diferença entre eles é que o “-iname” não é case sensitive.

Digamos que no meu path existam os arquivos backup.rar e Backup.rar. Com o comando anterior ambos arquivos serão localizados ao passo que se usarmos o parâmetro “-name” somente backup.rar será exibido.

Exemplo 4 – Restringindo a busca pelo tipo do alvo

Com o parâmetro “-type” podemos melhorar nossa busca filtrando por arquivos (f), por diretórios (d) entre outros.

Vejamos as opções:

  • -type b = bloco
  • -type c = caractere
  • -type d = busca por diretórios
  • -type f = busca por arquivos
  • -type p = pipe
  • -type l = link simbólico
  • -type s = socket

No exemplo abaixo, estrou restringindo minha busca apenas por diretórios cujo nome atenda por “relatorios”.

O mesmo se aplica a buscas por arquivos:

Exemplo 5 – Limitando a quantidade de subdiretórios nas buscas

Com o parâmetro “-maxdepth” podemos limitar a quantidade de subdiretórios onde o find fará a nossa pesquisa. Assim, buscas mais breves (e leves) serão executadas.

Exemplo

Neste caso, a partir do meu path seria feita a busca por, no máximo, mais 1 nível de subdiretórios.

Exemplo 6 – Localizando arquivos de determinado usuário

Caso queira localizar arquivos de determinados usuários, pode-se utilizar o parâmetro “-user”. Este exemplo já foi usado no início do artigo. Vejamos mais um exemplo:

Neste exemplo, estou buscando por arquivos em /var/tmp cujo owner seja o usuário wil.

Também pode-se fazer essa mesma busca usando o UID do usuário (Número de identificação do usuário).

Observação: Para saber o uid do usuário basta rodar o comando id usuario.

Exemplo 7 – Localizando arquivos utilizando suas permissões

Podemos usar o parâmetro “-perm” para localizar arquivos com determinadas permissões.

No exemplo abaixo, estou pesquisando por arquivos com permissão 777:

Exemplo 8 – Pesquisando arquivos pela data de acesso ou modificação

Existem alguns parâmetros pelos quais pode-se localizar arquivos acessados ou modificados utilizando uma data como referência.

Primeiramente, vejamos os parâmetros:

amin arquivos acessados em X minutos, +X minutos ou -X minutos
cmin arquivos modificados em X minutos, +X minutos ou -X minutos
ctime arquivos com atributos (owner, permissão ou movido de lugar) modificados em X dias, +X dias ou -X dias
mtime arquivos com conteúdo modificado em X dias, +X dias ou -X dias
atime arquivos acessados (vim, grep, cat, head, tail, etc) em X dias, +X dias ou -X dias

Perceba que “X” é o valor a ser considerado pelo comando find. Veja também que mencionei -X e +X. Vamos entender isso nos exemplos abaixo:

Localizando arquivos acessandos nos ultimos 30 minutos:

Ou seja, aqui serão exibidos os arquivos acessandos nos últimos 30 segundos (Ou seja, menos de 30 minutos). Vejamos mais alguns exemplos:

Arquivos acessados a mais de 30 minutos e menos de 120 minutos

Arquivos modificados a menos de 20 minutos:

Arquivos cuja permissão/owner foi modificado ou foi movido de local a menos de 3 dias:

Arquivos cujo conteúdo foi modificado a menos de 5 dias:

Arquivos acessados a menos de 7 dias:

Exemplo 9 – Localizando arquivos pelo tamanho

Com o parâmetro “-size” podemos localizar arquivos pelo seu consumo de disco útil.

No “-size” também se imprega o uso do “+” e “-“. Ou seja, podemos buscar por +500M ou -500M ou os dois.

Os valores aqui podem ser k, M ou G. Exemplo:

Como dito anteriormente, pode-se usar os dois ao mesmo tempo. Basta repetir o parâmetro “-size”:

Exemplo 10 – Invertendo a busca

Ao invés de buscarmos por um termo, podemos usar os parâmetros “-not” ou “-!” para não exibir determinados termos. Assim, estaríamos invertendo a busca ao deixar de exibir algo para exibir todo o restante.

Não ficou claro? Bom, tudo bem, é um artigo longo. Vamos ao exemplo:

Exibindo todo conteúdo do path, menos arquivos .zip

Ou

Exemplo 11 – Localizando e executando comando concatenado

Por fim, mas não menos importante (e muito pelo contrário), temos o “-exec” que como o nome sugere nos permite executar determinado comando caso o find encontre o que queremos. Neste caso, o “-exec” funcionará como um laço onde para cada arquivo/diretório localizado executará o comando definido.

Exemplo:

Neste exemplo, para cada arquivo cujo nome termina com “.gz” será executado o comando “mv -v arquivo /home/wil/Backup”.

O “{}” representa o arquivo localizado e o “\;” encerra todos valores necessários para usarmos o “-exec”

No próximo exemplo, todo arquivo com mais de 7 dias de acesso existente no meu path será removido:

Testando o aprendizado

Agora que o amigo(a) chegou até aqui, concluo que já deve estar por dentro do comando find.

Olhando o comando abaixo, o amigo(a) saberia dizer o que este comando faz?

Se a reposta for sim, parabéns. Você pegou o espírito da coisa.

Lembrando sempre da boa e velha man page para o caso de dúvidas.

Um abraço e até a próxima o/

Deixe uma resposta

This site uses Akismet to reduce spam. Learn how your comment data is processed.