19 de setembro de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Como encontrar arquivos com find

encontrar arquivos com find

Esse artigo exibirá um conjunto de exemplos para auxiliar a encontrar arquivos com find no Linux, seja desktop, Raspberry etc. Com esse comando podemos encontrar arquivos por nome, tipo, tempo e executar alguma ação sobre ele, se desejado. Comecemos.

Encontrar arquivos com find: Uso básico

Apesar da maioria das pessoas preferir usar o modo gráfico, o terminal é muito mais ágil e preciso, graças à flexibilidade de pesquisa, que pode ser elaborada ou simples.

O manual do GNU find pode ser visto nesse link.

find por nome

Começando pelo uso básico, vamos supor que queiramos encontrar um arquivo pdf, que é o datasheet do microfone INMP441. Não lembro como chamei o arquivo, apenas creio ter colocado a palavra “microfone” no nome do arquivo. Usando o caractere coringa, posso cercar a parte a ser pesquisada para que case com a palavra, esteja ela no início, meio ou fim do nome de arquivo:

find . -name *microf*

Nesse exemplo a busca percorrerá todo o caminho, diretórios e subdiretórios a partir de onde o comando está sendo executado, indicado por “.” (ponto). É como dizer: “A partir daqui”. Em seguida passamos a designação, que é a procura do arquivo pelo nome (“-name”) e por fim, damos o nome parcial ou integral do arquivo a procurar.

encontrar arquivos com find

Poderíamos definir apenas a extensão, substituindo *microf* por *.pdf. Assim, não sabendo o nome mas conhecendo a extensão, todas as ocorrências de arquivos com extensão .pdf serão exibidas.

find por tipo

Suponhamos que a intenção seja encontrar arquivos executáveis em um diretório. No Linux a extensão não importa, nem precisa ter extensão. Desse modo, podemos ter shell script com a extensão .sh ou sem extensão. Tenho um diretório para programas específicos no diretório home do meu usuário /home/djames. Esse diretório chamo de bin. Vou usá-lo como referência, pois dentro dele tenho ao menos 3 exemplos de utilização por tipo.

Supondo que eu queira encontrar os arquivos de programas executáveis nesse diretório:

find bin -type f -executable -print

Desse modo, todos os arquivos dentro de bin que forem executáveis serão exibidos. Podemos usar o tipo f para arquivos, d para diretórios, l para links simbólicos etc.

Encontrar arquivos com find: Começando a esquentar

Podemos fazer pesquisas bastante avançadas com find, mas vamos gradativamente.

find por permissão

Para encontrar arquivos com find através do tipo de permissão é necessário conhecer outra característica fundamental do sistema de arquivos do Linux: As permissões.

Um arquivo poder ser readble, writeable, executable; logo, rwx. Com o comando ls -l conseguimos ver quais os atribuitos do arquivo:

encontrar arquivos com find

À esquerda temos um bit especial que indica outras características. Por exemplo, se for um diretório, ele estará marcado como d. Em seguida temos rwx e então r-x e então .

O arquivo pode ter 3 níveis básicos de permissão: O owner, o group e others. O proprietário é o charmoso djames e nesse caso, o grupo também é djames, mas poderia ser dialout, www ou qualquer outra coisa conforme a necessidade. Others são os demais – ou “qualquer um”.

Nesse arquivo de firewall, o proprietário pode ler, escrever e executar. O grupo pode ler e executar. Isso significa que só o proprietário do arquivo pode modificá-lo. Others não pode fazer nada.

As permissões de cada grupo corresponde a 1 byte, de modo que da esquerda para a direita temos 4, 2, 1. Os bits são lidos da direita para a esquerda, já enfatizei isso em montes de artigos, principalmente nos de bitwise. Isso significa que as permissões acima correspondem a 750. Se quiséssemos que others pudessem ler o conteúdo, poderíamos mudar as permissões assim:

chmod 754 frw.sh

E tudo isso foi pra poder mostrar o find por permissões. Esse find pode ser útil para encontrar arquivos com permissões que não são esperadas, por exemplo, permissão de execução em um arquivo no qual others não poderia tê-la. No exemplo, vou procurar por todos os arquivos que tenham as permissões como descritas acima:

find bin/ -type f -perm 750

O que resultou em:

O problema é que se não estivermos buscando por uma permissão específica e sim por todos os arquivos executáveis em qualquer permissão, não teremos um casamento perfeito na busca. Para isso, temos uma outra opção:

find . -type f -exec test -x {} \; -print

Desse modo serão testados os arquivos no diretório alvo, mas será necessário indicar o print ao final para que os arquivos que casam com a condição sejam exibidos. Mas dá pra simplificar, só que invés de apenas procurar por executáveis, vamos definir a extensão .sh:

find bin/ -name "*.sh" -type f -executable

Resultando em algo como:

encontrar arquivos com find

find por tempo

Uma coisa que costumo fazer é salvar o arquivo e não ver com que nome foi salvo. A maneira mais simples de encontrar esse arquivo, sem saber sua extensão ou nome, é usando o find com tempo. Se acabei de salvar, posso procurar no diretório de downloads por arquivos com o tempo de criação menor que 1 minuto. Por exemplo:

find Downloads/ -mmin -1

Mas também a casos que queremos mais do que procurar por minutos. Talvez queiramos um arquivo do dia anterior. Nesse caso, podemos usar outro recurso do find:

find Downloads -mtime -1

Uma outra possibilidade é querer excluir arquivos de log, por exemplo, de um programa em desenvolvimento, cujo log é utilizado para depuração. Supondo que a cada X tempo é gerado um arquivo (novamente, como exemplo, 1 hora por arquivo), poderiamos ter montes de arquivos em apenas 1 mês. Se quisermos excluir arquivos com mais de 4 dias em um diretório específico, podemos executar o find assim:

find DIRETORIO_ESPECIFICO -mtime +3 -exec rm -f {} \;

Se temos um arquivo, por exemplo batata.csv e sabemos que depois dele criamos outros arquivos relacionados mas não lembramos o nome, podemos usá-lo como referência de tempo para o find:

find Downloads/ -newer batata.csv

O artigo era pra ser algumas dicas sobre como encontrar arquivos com find usando alguns recursos, mas nessa penúltima amostra incluí a interação (perigosa, por sinal) com a utilização do parâmertro exec, que permite executar alguma coisa sobre os casamentos. Invés de usar o rm, preceda a execução com ls para listar os arquivos, assim você confirma que as ocorrências podem realmente ser eliminadas. Feito isso, substitua o ls por rm. Se fizer c4g4d4, a culpa é sua, não minha.

O find é utilizado em bots de manutenção e gerenciamento de sistema, sendo um comando prático utilizado pela maioria dos administradores de sistemas Linux. Ter um Raspberry não só lhe propicia conhecimento em Linux, mas em administração de sistema. Aproveite a plaquinha para ir além, não fique na moda dos emuladores; essa é minha sugestão de 2 centavos.