"No such file or directory" quando o arquivo existe
O que este artigo resolve
- Por que
lsmostra um arquivo mas você ainda recebeNo 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:
- Caracteres ocultos no nome do arquivo -> revele com
ls -b - Shebang de script com CRLF ou caminho errado -> verifique finais de linha com
cat -A - Um symlink cujo alvo desapareceu -> vermelho no
ls -la, confirme comreadlink -f - 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
targete./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 -bpara 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 directoryaparece 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.
Causa 3: Um symlink cujo alvo desapareceu
Conclusão: O link em si ainda aparece no
ls, mas um symlink pendente retornaNo such file or directoryao acessar. Confirme com a cor nols -laereadlink -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 comfile.
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 comnamei -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".