没有这个文件或目录?但是文件确实存在!

我下载了一个游戏(Shank),但是bin文件无法运行。当我尝试启动可执行文件时,显示的错误信息是:
bash: ./shank-linux-120720110-1-bin: No such file or directory

4也许先执行 "chmod u+x ./shank*bin"? - agent86
2也许应该是'.bin'而不是'-bin',可能只是个打字错误。 - Anake
谢谢你的回复。我按照Agent86说的命令做了,但是结果还是一样。我也下载了.deb文件,但是也遇到了问题。我不知道这个游戏有什么问题。 - Francesco
请确认您是否正在运行64位的安装(这是这个问题最常见的情况)。 - Gilles 'SO- stop being evil'
是的,我确认我在我的笔记本电脑上使用的是64位架构。 - Francesco
2@agent86:不是的。在那种情况下,错误信息会显示为“权限被拒绝”。 - David Foerster
如果你运行一个脚本,请使用bash -x scriptname.sh来追踪错误。 - Avatar
9个回答

你可能正在尝试在一个没有安装32位支持的64位系统上运行32位二进制文件。
有三种情况会出现“没有这个文件或目录”的消息:
1. 文件不存在。我假设你已经检查过文件确实存在(可能是因为shell自动补全了它)。 2. 有一个同名的文件,但它是一个悬空的符号链接。 3. 文件存在,而且你甚至可以读取它(例如,命令file shank-linux-120720110-1-bin显示类似“ELF 32-bit LSB executable…”的内容),但当你尝试执行它时,却被告知文件不存在。
这最后一个案例中的错误信息确实令人困惑。它告诉你的是,运行程序所需的运行环境的关键组件缺失了。不幸的是,报告错误的渠道只有容纳错误代码的空间,而没有额外的信息来说明真正的问题是运行环境。如果你想要这个解释的技术版本,请阅读Getting “Not found” message when running a 32-bit binary on a 64-bit systemfile命令会告诉你这个二进制文件是什么。除了一些例外情况,你只能运行与你的Ubuntu版本相对应的处理器架构的二进制文件。主要的例外是,在64位(amd64,也称为x86_64)系统上可以运行32位(x86,也称为IA32)的二进制文件。
在Ubuntu 11.04及之前的版本中,如果要在64位安装上运行32位二进制文件,您需要安装ia32-libs软件包安装ia32-libs。如果需要安装其他库(如果需要,会收到明确的错误消息)。
自从11.10(oneiric)引入了multiarch支持以来,您仍然可以安装ia32-libs,但是您可以选择更精细的方法,只需获取libc6-i386安装libc6-i386(以及任何其他必要的库)。

谢谢你的出色回答,Gilles。虽然我还没有遇到这个问题(至少目前还没),不过我会把你的答案保存下来以备将来参考。 - Jim C
谢谢您详尽的回答!我下载的文件bin是唯一可用的格式(bin)。所以我认为它适用于所有架构。我还下载了我的架构(64位)的.deb文件,但出现了不同的错误。此时,我认为游戏受到了一些错误的影响,或者我无法安装这个游戏。现在我尝试下载libc6-i386并继续尝试安装它。如果有重大变化,我会再次写信给您。 感谢您的时间。 - Francesco
我找到了解决方案!写起来太长了,但如果有人需要,我愿意提供帮助。 - Francesco
4@Francesco 请发布解决方案!这很可能会帮助其他试图在Ubuntu上运行Shank的人。回答自己的问题是完全可以的 - Gilles 'SO- stop being evil'
1您可以使用 ldd 命令来检查是否缺少某个库文件。 在执行 ldd kgio_ext.so 时,可能会显示类似于 libruby.so.2.3 => not found 的信息,还有其他内容。 - EnabrenTane
1当移动可执行文件后,*bash: ...some...path...: No such file or directory* 可能会出现另一种情况。Bash似乎会缓存在$PATH中找到的可执行文件的路径;运行hash -r来清除缓存。参考:http://unix.stackexchange.com/a/5610/11352 - akavel
@akavel 这个问题是关于文件存在的情况。当然,还有很多情况会导致出现错误消息,指示文件不存在,而实际上确实不存在。 - Gilles 'SO- stop being evil'
@Gilles Hm; 对我来说,情况是文件存在,但在不同的路径(仍然在$PATH中)。但我同意这是可以争论的。 - akavel
这是来自魔多黑暗面的错误!非常难以调试。 - guilhermecgs
我与一个可执行文件有相同的问题,但没有涉及到32位内容。而且ldd返回了所有内容的匹配。不知道你是否了解其他导致可执行文件发出“找不到文件或目录”错误的原因,即使ldd返回了一个完整的已解析的64位库列表。 - Scott Smith
@ScottSmith 可能是 https://unix.stackexchange.com/questions/76490/no-such-file-or-directory-on-an-executable-yet-file-exists-and-ldd-reports-al/76514#76514 的某个变体。 - Gilles 'SO- stop being evil'

64位Ubuntu多架构系统

只有当file file-name的输出显示如下时,请按照此答案操作:

file-name: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped

在64位多架构的Ubuntu系统中运行32位可执行文件,您需要添加架构,并且还需要安装、、这三个库包。
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
./file-name

我会在最后一个命令中使用sudo:以sudo身份运行32位二进制文件(显然不是由您或Ubuntu编译的),可能存在风险。(即使作为非root用户,也要承认这一点) - alci
无论最终是什么,只要它能起作用。 - Avinash Raj
1需要注意的是,如果您使用的是CentOS或RedHat操作系统,这个答案并不适用。因为这个原因,我被耽误了几个小时。 - omikes
1在Kali 2 64位系统上,我只需要安装libselinux1:i386 - Aralox
就我个人而言,这对于我在树莓派操作系统64位版(基于Debian Buster)上的使用非常有效,只需将"i386"替换为"armhf"即可。谢谢! - Ivan X

进一步阐述@Gilles的回答,导致这个错误至少有三种情况:
1. 文件不存在。 2. 文件存在,但是是一个悬空的符号链接。 3. 文件存在(例如`file`命令可以正常工作),导致出现令人困惑的错误信息。这可能意味着加载器存在问题。
加载器问题的分类:
1. 可执行文件的加载器不存在。您可以使用file命令检查并查看加载器是否存在。例如: ``` file lmgrd lmgrd: ELF 64-bit LSB可执行文件,x86-64,版本1(SYSV),动态链接,解释器/lib64/ld-lsb-x86-64.so.3,适用于GNU/Linux 2.6.18,已剥离 ``` 请注意`interpreter /lib64/ld-lsb-x86-64.so.3`;如果此文件不存在,则需要安装它。对于16.04上的这个特定加载器,答案是sudo apt-get install lsb
2. 脚本加载器的问题(参见this answer)。
3. 缺少共享库--使用`ldd `检查是否有任何“not found”库。有关更多信息,请参见this answer
加载器不存在可能是由于32/64位不匹配或其他原因引起的。可能还有其他我不知道的加载器错误。

4在我的情况下,file lmutil 没有显示解释器,但是 ldd 显示了,并且安装 lsb 解决了这个问题。 - davidA
2在尝试在Alpine Linux的Docker镜像上运行Node 4.9.1时,遇到了这个额外的错误类别,我不得不安装libc6-compat来获取interpreter /lib64/ld-linux-x86-64.so.2的加载。感谢这个补充! - Martin Dale Lyness
在Ubuntu 20.04上解决“Deadline许可证服务器无法启动”问题。 - Xedret
"lmgrd"是我遇到问题的确切二进制文件,谢谢! - Sandwich
1疯了,我觉得我们在调试同一个可执行文件。lmutil和lmgrd...MOE许可证管理器?还是这是一个通用的许可证管理器底层。 - Scott Smith
@ScottSmith 通用的,我相信 - jtpereyda

这是一个记录了更多关于问题性质以及如何在Ubuntu 16.04上修复它的文字稿。请注意,尽管“file”报告“动态链接”,但“ldd”报告“不是动态可执行文件”。
$ ./myprogram
bash: myprogram: No such file or directory

$ file myprogram
myprogram: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.2.5, not stripped

$ ldd myprogram
    not a dynamic executable

一旦安装了libc6:i386,事情就开始变得更好了...
$ sudo apt-get install libc6:i386 # the initial fix
...

$ ldd myprogram
    linux-gate.so.1 =>  (0xf77fd000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7626000)
    /lib/ld-linux.so.2 (0x56578000)

$ ./myprogram
myprogram: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

完成任务,您可能需要逐个识别和安装额外的库...

$ sudo apt-get install libstdc++6:i386 ## may require various additional libs

$ ./myprogram
... works correctly ...

我不知道是否有一种系统化的方法来确定正确的库安装方式。在将错误消息映射到软件包名称时,需要进行一些猜测(使用制表符自动补全会有所帮助)。

ldd(错误地)报告“不是动态可执行文件”。 - Brent Bradburn

通过安装32位的deb包,我意识到我缺少一些库(除了ia32-libs和libc6)。我首先通过执行以下命令解决了这个问题:
sudo apt-get install -f          

然后我又遇到了另一个错误:

Message: SDL_GL_LoadLibrary 
Error: Failed loading libGL.so.1

显然,这些库已经正确安装了。不详细说明,我不得不手动链接这些库。后来我意识到,通过Synaptic安装以下软件包可能是一个更简单的解决方案:
libgl1-mesa-glx:i386
libgl1-mesa-dri: i386.

在那之后,下一个问题是播放时出现黑屏,我通过将/Shank/bin中的可执行文件替换为http://treefort.icculus.org/smb/smb-linux-mesa-hotfix-test.tar.bz2来解决。
希望对某人有用。 如果您需要更多帮助或更多细节,请随时与我联系。

这个错误发生在Windows系统上(由于与Linux系统不同的行分隔符引入了额外的字符),并且尝试在Linux上运行插入了额外字符的脚本时。错误信息是误导性的。
在Windows中,行分隔符是CRLF(\r\n),而在Linux中是LF(\n)。在我的情况下,这是因为在Windows上工作并上传到Unix服务器执行所导致的。

1提示:在VSCode中,您可以在右下角将换行符从“CRLF”更改为“LF”。 - Avatar
1谢谢你。你真是个救命稻草。我不知道任何人怎么能从这个错误信息中找到答案。我已经苦苦挣扎了好几天。然后我按照你的建议打开了VS code,打开了run.sh文件,并将行尾换行符从CRLF改为LF。然后我重新运行了dotnet build、docker build和docker run,一切终于都正常工作了!!!谢谢你。我想在部署到外部环境时,我没有遇到这个问题,因为当我们提交时,git会将行尾换行符更改为LF,然后在Windows上检出时又改回CRLF。 - Martin Lottering

谷歌将我导航到了这个页面。我的问题与该主题的标题有些关联,所以我在这里发帖给像我一样的未来访客:

这是一个非常奇怪的问题:

$ ls -lh
ls: cannot access .~dataprep.ipynb: No such file or directory
-????????? ? ?      ?           ?            ? .~dataprep.ipynb
-rw------- 1 tgowda mygroup 475K Jun 12 15:59 dataprep.ipynb

我看到那个文件.~dataprep.ipynb就在那里,有一些奇怪的??权限。 我只是想摆脱那个乱七八糟的文件。 rm命令无法删除它。mv命令也无法移动它。
然后...
$ python
>>> from pathlib import Path
>>> list(Path('.').glob("*.ipynb"))
[PosixPath('.~dataprep.ipynb'), PosixPath('dataprep.ipynb')]
>>> p = list(Path('.').glob("*.ipynb"))[0]
>>> p
PosixPath('.~dataprep.ipynb')
>>> p.unlink()
>>> list(Path('.').glob("*.ipynb"))
[PosixPath('dataprep.ipynb')]

那就是我成功击败它的方法。


以上答案都对我没有用,因为解释器发生了错误解析。

我已经在这里写了一个详细的答案,解释如何解决这个问题。

Thanks to this man who shared his experience with others solution here. thanks to him i was able to solve this problem.

To summarize, as @steeldriver though, there was an interpreter problem. the linker is giving to my program [/lib/ld64.so.1] as ELF interpreter but this path doesnt exist at all and i checked it by:

> ls /lib/ld64.so.1
ls: cannot access '/lib/ld64.so.1': No such file or directory

After that, i checked the interpreters path's on my ubuntu installation by:

> ls /lib64/ld-*
/lib64/ld-linux-x86-64.so.2  /lib64/ld-lsb-x86-64.so.2  /lib64/ld-lsb-x86-64.so.3

so the solution is to create a link of one of this interpreters to the inexistant interpreter path by:

sudo ln -s /lib64/ld-linux-x86-64.so.2 /lib/ld64.so.1

Now we re-check the inexistent interpreter one more time to see if its still inexisting or not:

> ls /lib/ld64.so.1
/lib/ld64.so.1

Now this command has returned /lib/ld64.so.1 instead of "inexistant file". so the problem was solved and i could run ./main successfully

所以,简而言之,您需要通过在终端中运行以下命令(Ctrl + Alt + T)来创建一个指向不存在的解释器路径的链接:
sudo ln -s /lib64/ld-linux-x86-64.so.2 /lib/ld64.so.1

虽然这个链接可能回答了问题,但是最好在这里包含答案的关键部分,并提供链接作为参考。只提供链接的答案如果链接页面发生变化可能会变得无效。- 来自评论 - Error404
完成,我希望你能取消那个删除投票。 - Mohamed Elleuch
谢谢你编辑你的回答,我进一步修改了它以改善格式和语法。不用担心删除投票,它很快会自动撤销! - Error404