497 Views
Tempo de leitura: 5 MinutosO 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:
find path parâmetros termos
Exemplo:
find /home -user wil
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.
find /home/wil/Downloads
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:
find /home/wil/Downloads -name xuxublza.jpg
Se acaso não souber a extensão do arquivo, podemos substituir o “jpg” deste exemplo pelo caractere * (asterísco).
find /home/wil/Downloads -name xuxublza.*
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:
find /home/wil/Downloads -name *blza.*
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.
find /home/wil/Downloads -iname backup.rar
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”.
find /home/wil/Downloads -name relatorios -type d
O mesmo se aplica a buscas por arquivos:
find /home/wil/Downloads -name relatorios -type f
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
find /home/wil/Downloads -name xuxublza.jpg -maxdepth 1
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:
find /var/tmp -user wil
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).
find /var/tmp -user 1000
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:
find /var/tmp -perm 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:
find /home/wil/Downloads -amin -30
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
find /home/wil/Downloads -amin +30 -amin -120
Arquivos modificados a menos de 20 minutos:
find /home/wil/Downloads -cmin -20
Arquivos cuja permissão/owner foi modificado ou foi movido de local a menos de 3 dias:
find /home/wil/Downloads -ctime -3
Arquivos cujo conteúdo foi modificado a menos de 5 dias:
find /home/wil/Downloads -ctime -5
Arquivos acessados a menos de 7 dias:
find /home/wil/Downloads -atime -7
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:
find /home/wil -size +500M
find /home/wil -size +2G
find /home/wil -size +1024k
Como dito anteriormente, pode-se usar os dois ao mesmo tempo. Basta repetir o parâmetro “-size”:
find /home/wil -size +5G -size -10G
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
find /home/wil/Downloads -not -name *.zip
Ou
find /home/wil/Downloads -! -name *.zip
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:
find /home/wil/Downloads/ -name *.gz -exec mv -v {} /home/wil/Backup/ \;
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:
find /home/wil/Downloads/ -atime +7 -exec rm -f {} \;
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?
find /home -name wil -type f -user wil -perm 777 -amin -30 -not -name *.zip -exec mv {} /home/usuarios_antigos \;
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.
man find
Um abraço e até a próxima o/