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 buscaexpressã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 dPesquisar por arquivo
find . -type fTipos disponíveis
| Carácter | Descrição |
|---|---|
f | arquivo normal |
d | diretório ou pasta |
l | link simbólico |
c | dispositivos de caracteres |
b | dispositivos 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ásn: exatamente n dias/minutos atrás
Arquivos modificados há mais de 1 dia
find . -mtime +1Arquivos modificados há menos de 1 dia (últimas 24h)
find . -mtime -1Arquivos modificados exatamente 1 dia atrás
find . -mtime 1Lista todos os arquivos alterados em menos de 1 minuto
find . -mmin -1Lista todos os arquivos alterados nas últimas 24 horas
find . -newermt "-24 hours" -lsListar todos os arquivos alterados no dia 11/04/2020
find . -newermt "2020-04-11" -lsPor permissão
Procurar arquivos por permissão por modo octal
find . -perm -744Por proprietário
Procurar arquivos pertencentes a um usuário
find . -user andersonProcurar arquivos pertencentes a um grupo
find . -group admPor tamanho
Procurar arquivos com o tamanho exato de 10m
find . -size 10MProcurar arquivos com o tamanho superior a 10m
find . -size +10MCom menos de 10m
find . -size -10MUnidades de medida
| 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 . -emptyfind . -type d -emptyfind . -type f -emptyCondicionais 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 fCada parêntese deve ser um argumento separado por espaço.
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" -deleteExecutar 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 1Buscar até 2 níveis de profundidade
find . -maxdepth 2Excluir 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" -printExcluir múltiplos diretórios
find . \( -path "./node_modules" -o -path "./.git" \) -prune -o -name "*.js" -printUsando 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 rmPara 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 rmSempre 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 {} \;