Nã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:

Exemplo do comando locate e updatedb updatedb #você precisa ser o usuário root para atualizar o índice locate apache2.conf #pode ser executado com o usuário comum locate -i apache2.conf #ignora o uso de maiúsculas e minúsculas locate -S #veja as estatística do banco de dados indexado 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 1 2 3 4 5 6 7 8 9 10 updatedb #você precisa ser o usuário root para atualizar o índice locate apache2 . conf #pode ser executado com o usuário comum locate - i apache2 . conf #ignora o uso de maiúsculas e minúsculas locate - S #veja as estatística do banco de dados indexado 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:

Exemplos do comando find find /etc -name apache2.conf #procura somente dentro do diretório /etc pelo nome exato "apache2.conf" find / -iname apache2.conf #pode demorar mais, pois a busca será feita em todos os diretórios e ignora o uso maiúsculas e minúsculas 1 2 3 find / etc - name apache2 . conf #procura somente dentro do diretório /etc pelo nome exato "apache2.conf" find / - iname apache2 . conf #pode demorar mais, pois a busca será feita em todos os diretórios e ignora o uso maiúsculas e minúsculas

Para ver outros exemplos de uso do comando find, acesse: http://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:

Exemplo do comando ln -s para resolver erro no such file or directory ln -s /caminho/atual/descoberto/pelo/find-locate/arquivo.h /caminho/link/simbolico/arquivo.h 1 ln - s / caminho / atual / 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:

Retorno do comando após a criação de um link simbólico ls -lh lrwxrwxrwx 1 mariano mariano 42 Mai 16 2013 /caminho/link/simbolico/arquivo.h -> /caminho/no/sistema-arquivos/arquivo.h 1 2 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.

Exemplo de uso do comando apt-file apt-file update #constrói e/ou atualiza a base de dados contendo os pacotes e lista de arquivos apt-file search crack.h #faz a busca por pacotes que possuem um arquivo com o nome "crack.h" 1 2 3 apt - file update #constrói e/ou atualiza a base de dados contendo os pacotes e lista de arquivos apt - file search crack . h #faz a busca por pacotes que possuem um arquivo com o nome "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:

Exemplo de uso do comando you whatprovides yum whatprovides "*/crack.h" 1 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.