Como resolver: No such file or directory - Arquivo ou diretório não encontrado
By Fernando Mariano
- 4 minutes read - 816 wordsNão é difícil no dia-a-dia da administração de servidores Linux ou no uso como estação de trabalho, o seguinte erro:
No such file or directory / Arquivo ou diretório não encontrado
Isso significa que o aplicativo tentou buscar um arquivo de texto, biblioteca ou diretório, porém nada foi encontrado no local esperado.
As falhas geralmente ocorrem quando:
- é feita a compilação de código fonte;
- é realizada a execução de daemons/serviços que fazem a leitura de arquivos de configuração que possuem as definições de locais de bibliotecas, arquivos de logs que apontam para locais errados.
Existem algumas formas de encontrar o arquivo ou diretório faltante, veja algumas alternativas:
O arquivo existe no sistema operacional e apenas está no local errado ou inesperado?
Comandos: updatedb / locate
O comando locate utiliza-se de base de dados local onde é indexado todos os arquivos do sistema operacional. Dessa forma, a procura pelo arquivo é extremamente rápida, entretanto o único pré-requisito é que o comando updatedb tenha sido executado recentemente para criar ou atualizar a base de dados. Caso contrário, mesmo que o arquivo exista e ele não está presente na base indexada, não será possível encontrá-lo com o comando locate.
Tente os comandos abaixo para chegar até o local correto do arquivo não encontrado:
# você precisa ser o usuário root para atualizar o índice
sudo updatedb
# pode ser executado com o usuário comum
locate apache2.conf
# -i ignora o uso de maiúsculas e minúsculas
locate -i apache2.conf
# veja as estatística do banco de dados indexado
locate -S
Database /var/lib/mlocate/mlocate.db:
32.014 directories
325.169 files
17.609.598 bytes in file names
7.489.403 bytes used to store database
Comando: find
O comando find funciona de forma parecida ao comando locate, porém na execução ele varre todo o sistema de arquivos em busca do arquivo especificado. A desvantagem é que, dependendo do diretório fornecido, a busca pode demorar vários minutos se o número de arquivos e o volume de dados do seu sistema forem grandes.
Veja alguns exemplos:
# procura somente dentro do diretório /etc pelo nome exato "apache2.conf"
find /etc -name apache2.conf
# pode demorar mais, pois a busca será feita em todos os diretórios e ignora o uso maiúsculas e minúsculas
find / -iname apache2.conf
Para ver outros exemplos de uso do comando find, acesse: https://pt.wikipedia.org/wiki/Find
Criar link simbólico como workaround
Se você encontrou o arquivo (exemplo: mylib.h
) com o comando find ou então locate, é preciso apenas criar um link simbólico para resolver o erro no such file or directory / arquivo ou diretório não encontrado.
Em algumas situações como a compilação de software, o comando make espera encontrar a biblioteca no caminho A (/usr/lib/mylib.h) , porém o arquivo está presente no caminho B (/lib/usr/mylib.h).
O workaround que pode ser utilizado neste caso é a criação do link simbólico de A para B. Dessa forma, na próxima execução do comando make, a compilação irá encontrar o link simbólico (atalho) indicando onde a biblioteca requisitada realmente se encontra.
Abaixo o exemplo para criar o link simbólico:
ln -s /caminho/descoberto/pelo/find-locate/arquivo.h /caminho/link/simbolico/arquivo.h
Ao executar o comando ls -lh é possível verificar o link simbólico apontando para o arquivo real do sistema de arquivos:
ls -lh
lrwxrwxrwx 1 mariano mariano 42 Mai 16 2013 /caminho/link/simbolico/arquivo.h -> /caminho/no/sistema-arquivos/arquivo.h
E se nada for encontrado com o comando locate ou find?
Pode ser que o arquivo não encontrado nem exista no sistema operacional. Mas como descobrir de qual pacote .deb ou .rpm contém o arquivo faltante?
Existem alguns comandos que podem lhe ajudar com essa tarefa, veja:
Comando: apt-file para Ubuntu e derivados do Debian
O apt-file funciona de forma similar ao apt-get ou aptitude. A partir da lista de repositórios em /etc/apt/sources.list
, o apt-file constrói a base de dados de pacotes disponíveis nos repositórios contendo o nome do pacote e todos os arquivos presentes em cada um deles.
Veja como encontrar o pacote proprietário do arquivo “crack.h” que pode ser exigido em compilações de programas que utilizam bibliotecas de criptografia. Na imagem, o pacote que contem o arquivo “crack.h” é o libcrack2-dev. Neste caso, digite apt-get install libcrack2-dev e a compilação deve funcionar corretamente.
# constrói e/ou atualiza a base de dados contendo os pacotes e lista de arquivos
apt-file update
# faz a busca por pacotes que possuem um arquivo com o nome "crack.h"
apt-file search crack.h
Comando: yum whatprovides para CentOS, Red Hat e outras distribuição baseadas no RPM
De forma semelhante ao apt-file o yum whatprovies também faz a procura por pacotes RPM que contém determinado arquivo dentro do pacote. Para utilizá-lo:
yum whatprovides "\*/crack.h"
Ainda não encontrou o arquivo que precisava?
Assim como vários outros problemas são resolvidos desta forma, você ainda pode procurar no Google. :) Mas caso conheça alguma ferramenta que pode ser utilizada para procurar arquivos no Linux, ou então, dentro de pacotes de outras distribuições como openSUSE, Slackware e etc, poste nos comentários o nome da aplicação.