"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 você ainda recebe No such file or directory
  • Como diferenciar caracteres ocultos, CRLF, symlinks quebrados e dynamic linker ausente
  • Como localizar um arquivo "existe mas inacessível" com comandos concretos e corrigi-lo

Resposta rápida (triagem mais rápida)

Quando algo "está lá mas não está", geralmente é uma destas quatro situações:

  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 executável 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 / família Debian (o raciocínio se aplica a outras distros também)
  • Shell: bash
  • Os exemplos usam nomes genéricos como target e ./run

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

Conclusão: Geralmente o nome de arquivo que você vê e a string de caminho que o kernel busca não correspondem byte a byte, ou a entidade de suporte do arquivo (alvo do link, interpretador) está ausente.

A saída do ls é formatada para humanos: espaços finais, caracteres de controle e estados de link quebrado não são obvios à primeira vista. Chamadas de sistema como open() e stat(), porém, comparam a string do caminho byte a byte. Então dois nomes podem parecer idênticos na tela mas diferir em seus bytes reais, e o kernel retorna ENOENT (No such file or directory).

Este erro se divide em duas famílias:

  • Incompatibilidade na string do caminho: caracteres ocultos no nome, caminho relativo deslocado, contaminação por CRLF
  • Entidade de suporte ausente: alvo de symlink excluído, dynamic linker ausente para um binário

Triamos abaixo em ordem de frequência.

Causa 1: Caracteres ocultos no nome do arquivo

Conclusão: Use ls -b para imprimir nomes de arquivo escapados e expor espaços finais, tabs ou espaços de largura total.

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

ls -b
target\

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

Para direcionar o arquivo de forma confiável, 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 também ajuda. cat -A marca cada final de linha com $, então um espaço final aparece logo antes do $.

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

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

Você executa ./deploy.sh, recebe No such file or directory, mas ls -l deploy.sh mostra o arquivo lá. Este é o clássico problema de shebang. Arquivos editados no Windows usam terminações de linha CRLF (\r\n), então #!/bin/bash é lido como #!/bin/bash\r. O kernel então 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 também pode estar errado (por exemplo #!/usr/local/bin/python enquanto o binário real está 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.

Conclusão: 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 simbólico é uma referência a outro caminho. Quando o alvo é excluído ou movido, o arquivo de link permanece enquanto seu conteúdo desaparece. O nome aparece no ls, mas você não 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 até 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 está quebrado. Recrie-o ou restaure o alvo correto.

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

Escrever através de um link, como em cp file target, pode resultar em cannot create ... No such file or directory quando o diretório alvo do link desapareceu. Sempre verifique se o erro aponta para o alvo do link.

Causa 4: O binário está sem seu dynamic linker (interpretador ELF)

Conclusão: Quando um binário compilado reporta ./run: No such file or directory, o item ausente não é o arquivo mas o dynamic linker (ld-linux) ou ABI que ele requer. Verifique o formato com file.

Um executável ELF precisa de um "dynamic linker" loader na inicialização. Se a arquitetura do binário (32/64-bit, arm/x86) difere do host, ou o dynamic linker necessário está ausente, o kernel rejeita o loader como No such file or directory. A parte confusa: o que está faltando é o loader, não o binário 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 está ausente no host, o binário não consegue iniciar. Confirme que o loader existe.

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

Para executar um binário 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 é uma incompatibilidade de arquitetura (um binário arm em x86, por exemplo), ele simplesmente não pode rodar. Compare a saída do file com o uname -m do host.

Causa 5: Um componente do caminho ausente ou deslocado

Conclusão: Nem sempre é o arquivo final. Um diretório intermediário ausente ou ilegível também produz No such file or directory. Rastreie o caminho um nível de cada vez com namei -l.

Quando você não consegue abrir /opt/app/data/config.yml, a peça faltante não é necessariamente config.yml. O diretório intermediário data pode não existir ou ser um link quebrado. namei -l resolve o caminho da raiz até 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 nível que reporta No such file or directory (aqui, data) é o responsável.

Um caminho relativo deslocado também é comum. Se cd levou você a um lugar inesperado, o mesmo ./config.yml aponta para outro lugar. Verifique sua localização com pwd, e use um caminho absoluto na dúvida.

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

Um til entre aspas não expande. cat "~/notes.txt" procura ~/notes.txt no diretório atual e falha. Use cat ~/notes.txt (sem aspas) ou cat "$HOME/notes.txt".

Resumo: checklist de cima para baixo

Quando disserem "está lá mas não 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 nível falha (Causa 5)

Leituras relacionadas: