Unix/Linux

find - Procurar arquivos e diretórios

O comando find é uma das ferramentas mais poderosas do Unix/Linux para localizar arquivos e diretórios. Diferente de outros comandos de busca, o find permite combinar múltiplos critérios como nome, tipo, tamanho, data de modificação e permissões.

Sintaxe básica:

find [caminho] [opções] [expressão]
  • caminho: Diretório onde a busca será iniciada (use . para o diretório atual)
  • opções: Modificadores do comportamento da busca
  • expressão: Critérios de busca e ações a executar

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 f

Tipos disponíveis

CarácterDescrição
farquivo normal
ddiretório ou pasta
llink simbólico
cdispositivos de caracteres
bdispositivos bloqueados

Por data

O find usa os prefixos +, - ou nenhum para indicar o período de tempo:

  • +n: mais de n dias/minutos atrás
  • -n: menos de n dias/minutos atrás
  • n: exatamente n dias/minutos atrás

Arquivos modificados há mais de 1 dia

find . -mtime +1

Arquivos modificados há menos de 1 dia (últimas 24h)

find . -mtime -1

Arquivos modificados exatamente 1 dia atrás

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

Com menos de 10m

find . -size -10M

Unidades de medida

CarácterDescrição
cbytes
kkilobytes
Mmegabytes
Ggigabytes
Bblocos de 512-byte

Por arquivo vazio

Procurar por arquivos ou pastas vazias

find . -empty
find . -type d -empty
find . -type f -empty

Condicionais para combinar diferentes formas de pesquisa

and

find -name "*dog" -type f

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

or

find -name "dog" -or -name "cat"
# ou usando o alias
find -name "dog" -o -name "cat"

not

find -not -name "dog"

O alias de -not é !, que geralmente precisa ser escapado como \! no terminal.

find \! -name "dog"

group

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

Cada parêntese deve ser um argumento separado por espaço.

Espaçamento correto nos parênteses do find

Executar ações com os arquivos encontrados

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

Os comandos a seguir podem modificar ou deletar arquivos permanentemente. Sempre teste primeiro com echo ou -print antes de executar ações destrutivas. Você é responsável pelos comandos executados no seu sistema. Consulte os termos de uso para mais informações.

Deletar arquivos 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 um comando para cada arquivo encontrado

Com o parâmetro -exec podemos executar um comando para cada arquivo encontrado ou para todos ao mesmo tempo.

Esse parâmetro, por padrão, substitui os caracteres {} com o caminho de cada arquivo encontrado ou com a lista de todos os arquivos encontrados.

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

  • \; o comando será executado separadamente em cada arquivo encontrado.
  • + o comando será executado uma única vez para todos os arquivos encontrados.

Existem alguns comandos que aceitam como parâmetro mais de um arquivo ou caminho, mkdir pasta1 pasta2 pasta3 ou touch arquivo1.txt arquivo2.txt arquivo3.txt, são nesses casos que podemos utilizar o + no final do -exec, se for utilizado com um comando que não é compatível com esses exemplos o resultado não será o esperado.

Irá executar o chmod em cada arquivo encontrado

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

Irá executar o chmod uma única vez em todos os arquivos encontrados

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

Outros

Limitar profundidade de busca

Buscar apenas no diretório atual (sem subdiretórios)

find . -maxdepth 1

Buscar até 2 níveis de profundidade

find . -maxdepth 2

Excluir diretórios da busca com -prune

O -prune permite excluir diretórios específicos da busca, melhorando a performance.

Buscar arquivos .js excluindo a pasta node_modules

find . -path "./node_modules" -prune -o -name "*.js" -print

Excluir múltiplos diretórios

find . \( -path "./node_modules" -o -path "./.git" \) -prune -o -name "*.js" -print

Usando com xargs

O xargs é uma alternativa ao -exec que oferece mais controle, como limitar o número de argumentos por execução (-n) ou executar em paralelo (-P).

find . -name "*.log" | xargs rm

Para a maioria dos casos, -exec {} + é suficiente e mais simples. Use xargs quando precisar de funcionalidades extras como paralelismo.

Lidando com espaços em nomes de arquivos

Use -print0 com xargs -0 para lidar corretamente com arquivos que contêm espaços ou caracteres especiais no nome.

find . -name "*.txt" -print0 | xargs -0 rm

Sempre use -print0 com xargs -0 quando não tiver certeza se os nomes de arquivos contêm espaços. Isso evita erros e comportamentos inesperados.

Exemplo prático

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 {} \;