Procurando arquivos no Linux

(Last Updated On: 6 de outubro de 2017)

Estava trabalhando com alguns arquivos de pagamentos e salvei no servidor, só que não lembro em qual pasta ele foi salvo… Preciso desse arquivo para ontem.

Bom, o servidor usa um Linux CentOS que não possui modo gráfico, apenas terminal. Eu poderia instalar algum modo gráfico, porém ela ocupará um espaço a mais no servidor além de demorar para baixar e instalar.

Preciso desses arquivos rápido e tenho apenas o terminal em mãos… como posso encontrá-los?

Usando o find para achar arquivos

Para buscar um arquivo utilizando o terminal, basta pedir para ele procurar (find), em todo meu sistema(/), algo que contenha o nome (-name) que queremos. Bom, eu sei que o nome dos arquivos contém pagamentos então é só acrescentá-lo ao comando.

find / -name pagamentos

Conseguimos localizar alguns arquivos, mas nenhum desses é o arquivo que quero ainda…

O arquivo que eu quero tem uma extensão CSV. Então vamos informar isso ao find

find / -name pagamentos.csv

Legal resolvemos nosso problema! Mas ainda tem um detalhe… Lembro que não tinha apenas um arquivo de pagamentos no servidor. Por que ele não apareceu?

Será que é porque está escrito com letras maiúsculas?

O programa find diferencia letras maiúscula e minúsculas, ou seja, ele é case-sensitive.

Nesse contexto, existem algumas complicações que podem ocorrer, como:

  • Início da palavra com letra maiúscula: Pagamentos.txt;
  • Início da palavra com letra minúscula: pagamentos.txt;

  • Letras maiúsculas no meio da palavra: pAgAmenTos.txt.

Como faço para que o find os liste para mim?

Ignorando a caixa alta

Para que não considere se é maiúscula ou minúscula, temos que falar para o find ignorá-las. Então, basta colocar o parâmetro i antes do name. Ficando, assim:

find / -iname pagamentos.csv

Vamos testar nosso comando e ver se ele retorna nossos três arquivos:

Legal! Agora conseguimos ver dois arquivos. Mas ainda tem mais arquivos que contém pagamento no nome… Por que não estão aparecendo? Existe alguma maneira de listá-los?

Sim! Para isso vamos utilizar algumas expressões regulares que indicarão para o programa essa situação.

Mas quais são essas expressões?

Buscando com apenas uma parte do nome

Bom, sabemos que o nome do arquivo contém a palavra pagamento. Então eu tenho que dizer para o find, “por favor, procure para mim em todo meu sistema(/), sem se importar com o maiúsculas e minúsculas (-iname), o arquivo que comece com pagamento* seguido de qualquer coisa”.

O asterisco indica que o nome pode ser seguido de qualquer coisa, sejam espaços em branco, outras palavras, letras, números …

Viram? A nossa busca retornou tanto os arquivos quanto diretórios que continham essa parte da busca no nome.

E o mais legal, a gente pode usar o asterisco onde quisermos na busca. Antes da palavra começar, por exemplo. Reparem nessa pesquisa:

find -iname *pagamento*

Dessa forma conseguimos obter todas as combinações com a nossa string de busca.

Além do asterisco, você pode usar outras expressões regulares como ?, [a-z] ou aquelas que você mais necessita na hora.

Tudo bem, até o momento aprendemos a buscar arquivos em todo o sistema. Mas e quando queremos realizar uma busca em um determinado lugar como, por exemplo, uma pasta? Se eu quisesse buscar somente os arquivos do diretório financeiro, como posso fazer?

Buscando em um diretório específico

Da mesma maneira que pedimos para o find procurar arquivos em todo o meu sistema, podemos especificar uma pasta específica e ele buscaria apenas os arquivos desse diretório.

Bem, queremos que todos os arquivos de pagamento que estão na pasta financeiro, logo vamos dizer isso para o find informando o caminho até o diretório.

find /compartilhamento/financeiro -iname *pagamento*

Conseguimos todos os resultados que contém “pagamento” como parte do nome.

Esse tipo de consulta é importante, pois caso o computador tenha muitos arquivos, o programa não precisará ver em todos os locais possíveis no sistema, somente na pasta indicada. Isso otimiza o tempo de retorno da busca, já que o programa não terá que varrer todo sistema.

“Legal! Conseguimos buscar arquivos em todo o sistema, mas só o find que faz isso, ou existe algum outro?”

Além do find, temos outro programa que realiza busca nos sistemas, o locate.

Buscando arquivos com Locate

O uso do locate é parecido com o do find. Precisamos informar para nosso sistema localizar (locate) um arquivo com o nome que queremos. Por exemplo: pagamentos

locate pagamentos

Pronto! Temos a localização do nosso arquivo. O Locate, portanto, assim como o find, é outro programa utilizado para fazer buscas no sistema. Contudo ele retorna as buscas um pouco mais rápido que o segundo. Isso porque ele faz a busca em um banco de dados próprio.

Ou seja, quando o locate é usado para fazer uma pesquisa ele procura em seu catálogo(banco de dados) e nos mostra os resultados. Ao contrário do find que faz uma varredura em todo o sistema buscando o arquivo.

Repararam que utilizando o locate apareceram outros resultados que continham pagamentos no nome? Isso acontece, pois por padrão o locate já usa asteriscos no começo e no fim da string de busca, procurando em todos os lugares onde a palavra se encontra.

Esse comando equivale a find / -name *pagamentos*:

A saída é a mesma, apenas em uma ordem diferente.

Também podemos ignorar (-i) se as letras estão em caixa alta ou baixa.

locate -i pagamentos

E novamente ele nos retornou a localização de nosso arquivo, não apenas de um, mas de todos que continham a string de busca no nome.

Agora, que tal fazer um teste? Vamos criar um arquivo de texto comum em qualquer lugar chamado teste.txt. Depois usar o locate para tentar localizá-lo.

locate teste

Hum… o resultado que esperávamos não está aparecendo. Por quê?

Entendendo o banco de dados do locate

Vimos que o locate faz uso de um banco de dados para realizar suas pesquisas, porém quando criamos um arquivo ele não é automaticamente inserido no banco de dados sendo necessário atualizá-lo.

Para que o banco de dados seja atualizado temos que utilizar o comando updatedb. Para isso devemos estar logados como root, ou utilizar sudo na frente do comando

Assim, se fizermos novamente a busca ela já retornará o nosso arquivo:

Com isso nosso banco foi atualizado e obtivemos o resultado esperado.

Conclusão

Queria localizar um arquivo no servidor que não tinha modo gráfico. Vimos como podemos procurar nossos arquivos no terminal, utilizando o nome do arquivo, ou parte do nome, em uma pasta ou em todo o sistema.

Para isso, existem alguns programas, como o find e o locate. Vimos como utilizar cada um, seu funcionamento e suas diferenças.

E aí, o que achou? Já conhecia essas técnicas? Conhece outras? Compartilhe conosco nos comentários 🙂

Gosta de Linux? Aqui na Alura temos um carreira completa sobre ele. Nela você aprenderá sobre o sistema, como utilizar o terminal para fazer suas tarefas, sobre a filosofia Open Source, além de muito mais coisas para você dominar esse sistema operacional.

Fique por dentro

  • Leticia Ozono

    Muito bom! 😉

  • NM

    Um comando complementar que pode ser usado em caso de emergência é o lsof. Acredito que mereça um artigo só para ele!

    • Yuri Oliveira

      Realmente, esse comando pode ser muito útil em alguns casos.

      Obrigado pela sugestão! 🙂
      Já anotei aqui na lista de temas para os próximos posts.

Próximo ArtigoComo foi a BrazilJS?