"No such file or directory" quando o arquivo existe

"No such file or directory" quando o arquivo existe

O que este artigo resolve

  • Por que ls mostra um arquivo mas voce ainda recebe No such file or directory
  • Como diferenciar caracteres ocultos, CRLF, symlinks quebrados e dynamic linker ausente
  • Como localizar um arquivo "existe mas inacessivel" com comandos concretos e corrigi-lo

Resposta rapida (triagem mais rapida)

Quando algo "esta la mas nao esta", geralmente e uma destas quatro situacoes:

  1. Caracteres ocultos no nome do arquivo -> revele com ls -b
  2. Shebang de script com CRLF ou caminho errado -> verifique finais de linha com cat -A
  3. Um symlink cujo alvo desapareceu -> vermelho no ls -la, confirme com readlink -f
  4. Um executavel sem seu dynamic linker (interpretador ELF) -> verifique o tipo com file

Executar apenas ls -b (caracteres ocultos) e ls -la (links quebrados) isola 80% dos casos.

Premissas (ambiente alvo)

  • SO: Ubuntu / familia Debian (o raciocinio se aplica a outras distros tambem)
  • Shell: bash
  • Os exemplos usam nomes genericos como target e ./run

Por que um arquivo existente reporta "No such file or directory"?

Conclusao: Geralmente o nome de arquivo que voce ve e a string de caminho que o kernel busca nao correspondem byte a byte, ou a entidade de suporte do arquivo (alvo do link, interpretador) esta ausente.

A saida do ls e formatada para humanos: espacos finais, caracteres de controle e estados de link quebrado nao sao obvios a primeira vista. Chamadas de sistema como open() e stat(), porem, comparam a string do caminho byte a byte. Entao dois nomes podem parecer identicos na tela mas diferir em seus bytes reais, e o kernel retorna ENOENT (No such file or directory).

Este erro se divide em duas familias:

  • Incompatibilidade na string do caminho: caracteres ocultos no nome, caminho relativo deslocado, contaminacao por CRLF
  • Entidade de suporte ausente: alvo de symlink excluido, dynamic linker ausente para um binario

Triamos abaixo em ordem de frequencia.

Causa 1: Caracteres ocultos no nome do arquivo

Conclusao: Use ls -b para imprimir nomes de arquivo escapados e expor espacos finais, tabs ou espacos de largura total.

Copy-paste e scripts gerados podem adicionar um espaco final, newline ou espaco de largura total a um nome de arquivo. Parece target, mas se o nome real e target (espaco final), entao cat target naturalmente falha com No such file or directory.

ls -b
target\

Um \ (barra invertida + espaco) final prova que o nome contem espaco em branco. Tabs aparecem como \t; um espaco de largura total aparece como octal, por exemplo \343\200\200.

Para direcionar o arquivo de forma confiavel, use Tab completion ou capture os bytes reais com find e renomeie.

find . -maxdepth 1 -name 'target*' -print
mv -i 'target ' target

ls | cat -A tambem ajuda. cat -A marca cada final de linha com $, entao um espaco final aparece logo antes do $.

Causa 2: O shebang do script tem CRLF ou caminho errado

Conclusao: Se ./script.sh: No such file or directory aparece enquanto o arquivo claramente existe, suspeite de terminacao de linha CRLF ou caminho de interpretador inexistente no shebang.

Voce executa ./deploy.sh, recebe No such file or directory, mas ls -l deploy.sh mostra o arquivo la. Este e o classico problema de shebang. Arquivos editados no Windows usam terminacoes de linha CRLF (\r\n), entao #!/bin/bash e lido como #!/bin/bash\r. O kernel entao procura um interpretador no caminho /bin/bash\r e falha.

cat -A deploy.sh | head -1
#!/bin/bash^M$

Um ^M (CR) no final da linha confirma CRLF. Remova com sed ou dos2unix.

sed -i 's/\r$//' deploy.sh

O caminho do shebang em si tambem pode estar errado (por exemplo #!/usr/local/bin/python enquanto o binario real esta em /usr/bin/python3). Verifique o caminho com head -1 e confirme que existe com command -v.

head -1 deploy.sh
command -v python3

Para o procedimento completo veja Corrigindo erro bad interpreter.

Conclusao: O link em si ainda aparece no ls, mas um symlink pendente retorna No such file or directory ao acessar. Confirme com a cor no ls -la e readlink -f.

Um link simbolico e uma referencia a outro caminho. Quando o alvo e excluido ou movido, o arquivo de link permanece enquanto seu conteudo desaparece. O nome aparece no ls, mas voce nao consegue abri-lo.

ls -la target
lrwxrwxrwx 1 user user 18 Jun  6 10:00 target -> /opt/app/current/bin

Em terminais coloridos, um link quebrado pisca em vermelho ou aparece invertido. Verifique se o alvo existe com readlink -f (que resolve ate o caminho real final) e um ls desse resultado.

readlink -f target
ls -la "$(readlink -f target)"

Se esse ls retorna No such file or directory, o link esta quebrado. Recrie-o ou restaure o alvo correto.

ln -sfn /opt/app/releases/2026-06-06/bin target

Escrever atraves de um link, como em cp file target, pode resultar em cannot create ... No such file or directory quando o diretorio alvo do link desapareceu. Sempre verifique se o erro aponta para o alvo do link.

Causa 4: O binario esta sem seu dynamic linker (interpretador ELF)

Conclusao: Quando um binario compilado reporta ./run: No such file or directory, o item ausente nao e o arquivo mas o dynamic linker (ld-linux) ou ABI que ele requer. Verifique o formato com file.

Um executavel ELF precisa de um "dynamic linker" loader na inicializacao. Se a arquitetura do binario (32/64-bit, arm/x86) difere do host, ou o dynamic linker necessario esta ausente, o kernel rejeita o loader como No such file or directory. A parte confusa: o que esta faltando e o loader, nao o binario em si.

file ./run
./run: ELF 32-bit LSB executable, Intel 80386, dynamically linked,
interpreter /lib/ld-linux.so.2, ...

Se o loader indicado por interpreter /lib/ld-linux.so.2 esta ausente no host, o binario nao consegue iniciar. Confirme que o loader existe.

ls -l /lib/ld-linux.so.2

Para executar um binario 32-bit em um host 64-bit, instale o runtime 32-bit.

sudo dpkg --add-architecture i386
sudo apt update && sudo apt install libc6:i386

Se e uma incompatibilidade de arquitetura (um binario arm em x86, por exemplo), ele simplesmente nao pode rodar. Compare a saida do file com o uname -m do host.

Causa 5: Um componente do caminho ausente ou deslocado

Conclusao: Nem sempre e o arquivo final. Um diretorio intermediario ausente ou ilegivel tambem produz No such file or directory. Rastreie o caminho um nivel de cada vez com namei -l.

Quando voce nao consegue abrir /opt/app/data/config.yml, a peca faltante nao e necessariamente config.yml. O diretorio intermediario data pode nao existir ou ser um link quebrado. namei -l resolve o caminho da raiz ate o fim e mostra exatamente onde falhou.

namei -l /opt/app/data/config.yml
f: /opt/app/data/config.yml
 drwxr-xr-x root root /
 drwxr-xr-x root root opt
 drwxr-xr-x root root app
                      data - No such file or directory

O nivel que reporta No such file or directory (aqui, data) e o responsavel.

Um caminho relativo deslocado tambem e comum. Se cd levou voce a um lugar inesperado, o mesmo ./config.yml aponta para outro lugar. Verifique sua localizacao com pwd, e use um caminho absoluto na duvida.

pwd
cat /opt/app/data/config.yml

Um til entre aspas nao expande. cat "~/notes.txt" procura ~/notes.txt no diretorio atual e falha. Use cat ~/notes.txt (sem aspas) ou cat "$HOME/notes.txt".

Resumo: checklist de cima para baixo

Quando disserem "esta la mas nao encontra", siga esta ordem:

  • ls -b target -- revelar caracteres ocultos no nome (Causa 1)
  • cat -A script.sh | head -1 -- verificar CRLF / final de linha do shebang (Causa 2)
  • ls -la target / readlink -f target -- verificar symlink quebrado (Causa 3)
  • file ./run -- verificar o dynamic linker e arquitetura (Causa 4)
  • namei -l /path/to/file -- encontrar qual nivel falha (Causa 5)

Leituras relacionadas: