# Utilizando o comando find para procurar arquivos e diretórios no Linux ou MacOS

O comando find permite aos usuários buscar arquivos, diretórios, links simbólicos, dispositivos de caracteres e dispositivos de bloco em seu sistema de arquivos.

Além disso, você pode usar várias opções e operadores com o comando find para refinar sua pesquisa. Isso inclui pesquisar por tipo de arquivo, permissões, proprietário, grupo, tamanho, data de modificação e muito mais.

# Diferentes formas de procurar por um arquivo

# Por nome

Com case-sensitive

find . -name "arquivos.txt"

Sem case-sensitive

find . -iname "arquivos.txt"

# Por tipo

Pesquisar por diretório

find . -type d

Pesquisar por arquivo

find . -type d

# Por data

Arquivos mais antigos em n dias

find . -mtime +1

Arquivos modificados em n dias

find . -mtime -1

Lista todos os arquivos alterados em menos de 1 minuto

find . -mmin -1

Lista todos os arquivos alterados nas últimas 24 horas

find . -newermt "-24 hours" -ls

Listar todos os arquivos alterados no dia 11/04/2020

find . -newermt "2020-04-11" -ls

# Por permissão

Procurar arquivos por permissão por modo octal

find . -perm -744

# Por proprietário

Procurar arquivos pertencentes a um usuário

find . –user anderson

Procurar arquivos pertencentes a um grupo

find . –group adm

# Por tamanho

Procurar arquivos com o tamanho exato de 10m

find . -size 10M

Procurar arquivos com o tamanho superior a 10m

find . -size +10M

Procurar arquivos com menos de 10m

find . -size -10M

# Unidades de medida para utilizar com o find -size

Carácter Descrição
c bytes
k kilobytes
M megabytes
G gigabytes
B blocos de 512-byte

# Por arquivo vazio

Procurar por arquivos ou pastas vazias

find . -empty

Procurar por pastas vazias

find . -type d -empty

Procurar por arquivos vazios

find . -type f -empty

# Procurar por tipo

Procurar arquivos por tipo

find . -type f
Carácter Descrição
f arquivo normal
d diretório ou pasta
l link simbólico
c dispositivos de caracteres
b dispositivos de blocos

# Condicionais para combinar diferentes formas de pesquisa

# and

find -name "*dog" -type f

-and é o padrão, o comando acima é igual a find -name "*dog" -and -type f

# or

find -name "dog" -or -name "cat"

# not

find -not -name "dog"

# group

find \( -name "dog" -or -name "cat" \) -type f

# Alias de condicionais

  • -o = -or
  • -a = -and
  • !   = -not (Talvez precise escapar \!)

# Executar ações com os resultados do find

O find não seve somente como uma forma de procurar arquivos, ele também serve como um filtro para executar comandos.

# Deletar resultados encontrados

Devemos tomar cuidado com esse parâmetro use-o apenas em ocasiões que o arquivo sempre terá que ser apagando, sem existir o risco de perder informação.

find . -name "*.tpm" -delete

# Executar comando para os resultados encontrados

Com o parâmetro -exec, podemos executar um comando para cada resultado encontrado, ou um comando para todos os resultados encontrados simultaneamente.

No final do -exec sempre temos que utilizar \; ou +:

  • \; o comando será executado separadamente em cada resultado.
  • + o comando será executado uma única vez para todo resultado.

Com o -exec utilizamos o conjunto de caracteres {} para indicarmos onde deverá ficar os resultados encontrados pelo find.

Executar o chmod em cada arquivo encontrado (pois utilizados o \;):

find -name "*.php" -exec chmod 755 {} \;

Executar o chmod uma única vez em todos os arquivos encontrados (pois utilizados o +):

find -name "*.php" -exec chmod 755 {} +

# Configurando a profundidade da pesquisa

# Número máximo de níveis de diretórios

Pesquisar somente no diretório atual

find . -maxdepth 0

Pesquisar no diretório atual e no primeiro nível de subdiretório

find . -maxdepth 1

Pesquisar no diretório atual e no primeiro e segundo nível de subdiretório

find . -maxdepth 3

# Número mínimo de níveis de diretórios

Pesquisa somente nos subdiretórios em diante

find . -mindepth 1

# Dica da Dica

Procurar todos os arquivos .php e .phtml que não tem a permissão 755 e modificar a permissão para esse valor.

find . \( -name "*.php" -or -name "*.phtml" \) -type f -not -perm 0755 -exec chmod 755 {} \;