Comando find do Linux: como encontrar arquivos e diretórios
O comando find no Linux procura no diretório especificado e em seus subitens arquivos ou diretórios que correspondam a condições como nome, tipo ou tamanho. Especifique o local da busca e as condições juntas, e coloque padrões de nomes de arquivos entre aspas para que o shell não os expanda antecipadamente.
Formato básico e escopo de busca
No formato a seguir, o caminho inicial é onde a busca começa, e as condições limitam o que encontrar. O próprio caminho também está incluído no alvo da busca. Os exemplos abaixo são baseados no GNU findutils find e no Bash.
find PATH EXPRESSION
find . explora o diretório atual e subdiretórios, e find /etc começa a partir de /etc. Se nenhuma condição for especificada, ele imprime os caminhos e também explora arquivos ocultos e diretórios ocultos. Diretórios sem permissões podem mostrar erros de acesso, e seus conteúdos não serão buscados.
O próximo exercício cria arquivos em um novo diretório temporário. Você precisa continuar no mesmo terminal para manter a variável workdir. Depois de imprimir o caminho para verificar a localização, execute o exemplo.
workdir=$(mktemp -d)
mkdir -p "$workdir/docs" "$workdir/empty-dir"
touch "$workdir/docs/app.conf" "$workdir/docs/EXTRA.CONF" "$workdir/docs/notes.txt" "$workdir/.hidden.conf" "$workdir/empty.txt"
printf '%s\n' "$workdir"
Procurar por nome e tipo de arquivo
-name faz correspondência com sensibilidade a maiúsculas e minúsculas com o componente final do caminho, não com o caminho completo. -iname não distingue maiúsculas de minúsculas. As aspas simples impedem que o shell expanda * antes de passar o padrão para find.
find "$workdir" -name '*.conf'
find "$workdir" -iname '*.conf'
O primeiro comando procura por app.conf e .hidden.conf, e o segundo comando também encontra EXTRA.CONF. A ordem da saída pode variar dependendo do ambiente. Digitar find /etc *.conf não tem condição de nome e pode agir de forma inesperada dependendo da expansão do shell, então evite-o. Em vez disso, use find /etc -name '*.conf'.
-type f procura por arquivos regulares, -type d procura por diretórios. Se as condições forem combinadas, todas devem ser atendidas.
find "$workdir" -type f -name '*.conf'
find "$workdir" -type d -name 'docs'
O primeiro comando exibe apenas arquivos regulares com extensões correspondentes, o segundo exibe apenas diretórios chamados docs. Por padrão, o GNU find não segue links simbólicos em subdiretórios. Para procurar os próprios links, use -type l.
Limitando o alcance por profundidade e itens vazios
-maxdepth 1 procura apenas até o caminho inicial e os itens diretamente abaixo dele. Para excluir o caminho inicial dos resultados, especifique também -mindepth 1. Recomenda-se colocar ambas as opções antes das condições no GNU find.
find "$workdir" -mindepth 1 -maxdepth 1 -type d
Na prática, docs e empty-dir logo abaixo serão exibidos. -empty encontra arquivos regulares vazios e diretórios vazios, permitindo que você os diferencie especificando o tipo desejado.
find "$workdir" -type f -empty
find "$workdir" -type d -empty
Os arquivos criados com touch na prática estão todos vazios. No segundo comando, empty-dir aparece. Não considere diretamente os resultados da pesquisa como alvos para exclusão; primeiro, verifique o caminho e as condições.
Executando comandos em arquivos encontrados
-exec executa comandos nos itens correspondentes. O exemplo a seguir exibe a contagem de bytes de arquivos regulares sem excluí-los. {} é substituído pelo caminho encontrado, e + agrupa vários caminhos o máximo possível para passar para o comando.
find "$workdir" -type f -name '*.conf' -exec wc -c -- {} +
Como os arquivos de prática estão vazios, a contagem de bytes de cada arquivo é exibida como 0. wc também pode exibir o total se vários arquivos forem recebidos. Mesmo que haja espaços nos nomes dos arquivos, cada caminho é passado como um argumento separado. Para executar o comando para cada item separadamente, você pode usar \; em vez de +.
Antes de combinar comandos de exclusão ou modificação, primeiro exiba apenas os caminhos sob as mesmas condições e verifique os alvos e backups. Em diretórios onde outros usuários podem alterar arquivos durante a busca, os alvos podem mudar mesmo depois da verificação, portanto, é necessária cautela extra. Para mais detalhes, consulte GNU find considerações de segurança.
Quando os resultados são diferentes do esperado
Se não houver resultados, verifique o caminho inicial, a diferenciação entre maiúsculas e minúsculas no nome, a extensão e o tipo de arquivo, nesta ordem. Além disso, verifique se o padrão foi colocado entre aspas e se é necessário o caminho completo em vez de -name. Ao pesquisar com base no caminho completo, você pode usar -path.
Se houver um erro de permissão, isso significa que existem áreas que não puderam ser pesquisadas. Verifique as permissões de acesso necessárias e, ao usar privilégios de administrador, limite cuidadosamente o alcance da pesquisa e as ações a serem executadas. Os significados detalhados dos padrões de nome e opções podem ser encontrados em explicação dos padrões de nome do GNU find.




