【问题标题】:"No such file or directory" but it exists“没有这样的文件或目录”但它存在
【发布时间】:2023-03-22 04:03:01
【问题描述】:

我只是想从命令行运行一个可执行文件,./arm-mingw32ce-g++,但随后我收到了错误消息,

bash: ./arm-mingw32ce-g++: No such file or directory

我正在运行 Ubuntu Linux 10.10。 ls -l列表

-rwxr-xr-x 1 root root  433308 2010-10-16 21:32 arm-mingw32ce-g++

使用 sudo (sudo ./arm-mingw32ce-g++) 给出

sudo: unable to execute ./arm-mingw32ce-g++: No such file or directory

我不知道为什么操作系统甚至看不到文件。有什么想法吗?

【问题讨论】:

    标签: shell command-line executable


    【解决方案1】:

    此错误可能意味着./arm-mingw32ce-g++ 不存在(但确实存在),或者它存在并且是内核识别的动态链接可执行文件,但其动态加载器不可用。运行ldd /arm-mingw32ce-g++可以看到需要什么动态加载器;任何标记为not found 的东西都是您需要安装的动态加载器或库。

    如果您尝试在 amd64 安装上运行 32 位二进制文​​件:

    【讨论】:

    • 太棒了,工作!顺便说一句,ldd 的输出是not a dynamic executable(在我安装 ia32-libs 之前)。
    • ia32-libs-* 在 Ubuntu 16.04 中已弃用,请改为安装 lib32ncurses5lib32z1
    • 这是 Nix 或 NixOS 在尝试运行 3rd 方二进制文件时的常见问题;见补丁。
    • @GaloisPlusPlus 帮助了我。谢谢。我必须安装lib32z1
    【解决方案2】:

    对于没有 32/64 位问题的简单 bash 脚本,我遇到了同样的错误。这可能是因为您尝试运行的脚本中有错误。这个ubuntu forum post 表示对于普通脚本文件,您可以在前面添加sh,您可能会从中得到一些调试输出。例如

    $ sudo sh arm-mingw32ce-g++
    

    看看有没有输出。

    就我而言,实际问题是我尝试执行的文件是 Windows 格式而不是 Linux。

    【讨论】:

      【解决方案3】:

      如果尝试运行脚本并且shebang 拼写错误,也可能会发生此错误。确保它是 #!/bin/sh#!/bin/bash 或您使用的任何解释器。

      【讨论】:

      • 我指的是可执行文件,而不是脚本。再说一次,其他人可能会发现此评论很有用
      • 没错,但我针对这个确切的问题提出了这个问题,所以正如你所说,也许其他人也会这样做。
      • 就我而言,我试图运行 ./my/full/path/myscript 而不是 ./myscript
      【解决方案4】:

      我在 Mac 上创建的文件遇到了同样的问题。 如果我尝试在带有 ./filename 的 shell 中运行它,我会收到未找到文件的错误消息。 我认为文件有问题。

      我做了什么:

      打开到服务器的 ssh 会话
      猫文件名
      将输出复制到剪贴板
      rm 文件名
      触摸文件名
      vi 文件名
      i 用于插入模式
      从剪贴板粘贴内容
      ESC 结束插入模式
      :wq!

      这对我有用。

      【讨论】:

        【解决方案5】:

        在尝试运行 Python 脚本时,我收到了同样的错误消息——这不是 @Warpspace 的预期用例(请参阅其他 cmets),但这是我搜索的热门搜索之一,所以也许有人会发现它很有用.

        在我的情况下,shebang 行 (#!/usr/bin/env python) 会绊倒 DOS 行尾(\r\n 而不是 \n)。一个简单的dos2unix myfile.py 修复了它。

        【讨论】:

          【解决方案6】:

          我在尝试在 Ubuntu 上构建 Selenium 源代码时遇到了这个错误。即使在我涵盖了所有先决条件之后,具有正确 shebang 的简单 shell 脚本也无法运行。

          file file-name # helped me in understanding that CRLF ending were present in the file.
          

          我在 Vim 中打开了这个文件,我可以看到,因为我曾经在 Windows 机器上编辑过这个文件,它是 DOS 格式的。我使用以下命令将文件转换为 Unix 格式:

          dos2unix filename # actually helped me and things were fine.
          

          我希望我们在跨平台编辑文件时要小心,我们也应该注意文件格式。

          【讨论】:

          • 成功了!在尝试了多种方法之后,这就是解决方案。谢谢!
          • 晚了十年,但功劳归于功劳。在我的情况下,在 Windows 上使用 WSL2,Windows 目录安装在 WSL 上运行的发行版内。 Windows 行尾 - unix 文件。
          • 谢谢,@BrentonThomas。我很高兴它有所帮助。我还没有在 Windows 上尝试过 WSL。我希望尽快使用它。
          【解决方案7】:

          我收到此错误“No such file or directory”,但它存在是因为我的文件是在 Windows 中创建的,并且我尝试在 Ubuntu 上运行它,并且该文件包含无效的 15\r ,其中曾经有一个新行。 我刚刚创建了一个新文件来截断不需要的东西

          sleep: invalid time interval ‘15\r’
          Try 'sleep --help' for more information.
          script.sh: 5: script.sh: /opt/ag/cont: not found
          script.sh: 6: script.sh: /opt/ag/cont: not found
          root@Ubuntu14:/home/abc12/Desktop# vi script.sh 
          root@Ubuntu14:/home/abc12/Desktop# od -c script.sh 
          0000000   #   !   /   u   s   r   /   b   i   n   /   e   n   v       b
          0000020   a   s   h  \r  \n   w   g   e   t       h   t   t   p   :   /
          
          0000400   :   4   1   2   0   /  \r  \n
          0000410
          root@Ubuntu14:/home/abc12/Desktop# tr -d \\015 < script.sh > script.sh.fixed
          root@Ubuntu14:/home/abc12/Desktop# od -c script.sh.fixed 
          0000000   #   !   /   u   s   r   /   b   i   n   /   e   n   v       b
          0000020   a   s   h  \n   w   g   e   t       h   t   t   p   :   /   /
          
          0000400   /  \n
          0000402
          root@Ubuntu14:/home/abc12/Desktop# sh -x script.sh.fixed 
          

          【讨论】:

            【解决方案8】:

            我刚刚在mingw32 bash 中遇到了这个问题。我已经从 Program Files (x86)\nodejs 执行了 node/npm,然后将它们移动到 disabled 目录中(基本上将它们从路径中删除)。我在路径中也有Program Files\nodejs(即64位版本),但仅在x86版本之后。重新启动 bash shell 后,可以找到 64 位版本的 npm。 node 一直都能正常工作(与移动 x86 版本时更改的 node -v 一起检查)。

            我认为bash -r 会起作用,而不是重新启动 bash:https://unix.stackexchange.com/a/5610

            【讨论】:

              【解决方案9】:

              以下命令适用于 16.4 Ubuntu

              当您的 .sh 文件损坏或未按照 unix 协议格式化时会出现此问题。

              dos2unix 将 .sh 文件转换为 Unix 格式!

              sudo apt-get install dos2unix -y
              dos2unix test.sh
              sudo chmod u+x test.sh 
              sudo ./test.sh
              

              【讨论】:

                【解决方案10】:

                正如其他人所说,这是因为找不到加载程序,而不是您的可执行文件。不幸的是,信息不够清楚。

                您可以通过更改可执行文件使用的加载程序来修复它,请参阅我在另一个问题中的完整答案:Multiple glibc libraries on a single host

                基本上你必须找到它正在尝试使用的加载器:

                $ readelf -l arm-mingw32ce-g++ | grep interpreter
                  [Requesting program interpreter: /lib/ld-linux.so.2]
                

                然后找到等效加载器的正确路径,并更改您的可执行文件以使用实际路径中的加载器:

                $ ./patchelf --set-interpreter /path/to/newglibc/ld-linux.so.2 arm-mingw32ce-g++
                

                您可能还需要设置包含的路径,您将在尝试运行它后知道是否需要。查看其他线程中的所有详细信息。

                【讨论】:

                  【解决方案11】:

                  我遇到了这个问题,原因是某些编辑器(例如 Notepad++)中的 EOL。您可以在编辑菜单/EOL 转换中检查它。应选择 Unix(LF)。 希望对你有用。

                  【讨论】:

                  • 在这种情况下这不太可能是问题,因为该命令不是从文件中执行的。
                  【解决方案12】:

                  在此处添加以供将来参考(适用于可能陷入相同情况的用户): 在 Windows 上工作(由于与 Linux 系统不同的行分隔符而引入了额外的字符)并尝试在 Linux 中运行此脚本(插入了额外的字符)时会发生此错误。错误信息具有误导性。

                  在 Windows 中,行分隔符是 CRLF (\r\n),而在 linux 中是 LF (\n)。这通常可以在文本编辑器中选择。

                  就我而言,这是由于在 Windows 上工作并上传到 Unix 服务器执行。

                  【讨论】:

                  • 我使用 docker、linux,但从 Windows 构建。我的脚本从scriptdir=$(cd "$( dirname "${BASH_SOURCE[0]}" )" &amp;&amp; pwd) 开始,然后是cd $scriptdir || exit 1,但我的Windows 编辑文件中的\r 被附加到scriptdir 值。所以: no such file or directory 的消息是最令人困惑的,因为它最终删除了它所抱怨的内容。
                  【解决方案13】:

                  我找到了我的 Ubuntu 18 here 的解决方案。

                  sudo dpkg --add-architecture i386
                  

                  然后:

                  sudo apt-get update
                  sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
                  

                  【讨论】:

                  • 这就是我的答案。谢谢!
                  【解决方案14】:

                  尝试运行 terraform/terragrunt (Single go binary) 时遇到此错误。

                  使用which terragrunt 查找可执行文件的位置,在本地目录或完整路径中运行时出现奇怪错误

                  bash: ./terragrunt: No such file or directory
                  

                  问题是安装了两个terragrunt,用brew uninstall terragrunt删除了一个修复它。

                  删除后,which terragrunt 显示新路径 /usr/bin/terragrunt 一切正常。

                  【讨论】:

                    【解决方案15】:

                    在我的例子中,文件是一个符号链接:

                    $ cat deluge-gtk.lock
                    cat: deluge-gtk.lock: No such file or directory
                    $ file deluge-gtk.lock
                    deluge-gtk.lock: broken symbolic link to 32309
                    

                    像这样的误导性错误在 Linux 上相当普遍。相关讨论:https://lwn.net/Articles/532771/

                    【讨论】:

                      【解决方案16】:

                      通过更改终端/命令提示符中未显示的文件或文件夹的名称来尝试一下。

                      step1 : 更改文件或文件夹的名称。 step2 : cd 文件名/文件夹名

                      【讨论】:

                      • 这个问题有 15 个现有答案,包括一个接受了 100 个赞的答案。您确定尚未提供您的答案吗?如果不是,为什么有人会更喜欢您的方法而不是提议的现有方法?您是否正在利用新功能?是否存在更适合您的方法的场景?
                      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
                      【解决方案17】:

                      对于那些在运行 java 程序时遇到此错误的人,您可能正在尝试在 32 位 linux 操作系统上运行 64 位 java 程序。

                      当我在 64 位 java 上运行 ldd 时才意识到:

                      ldd /usr/java/jdk1.8.0_05/bin/java

                      '不是动态可执行文件'

                      而旧的 32 位 java 报告了合理的结果:

                      ldd /usr/java/jdk1.8.0_05/bin/java

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2022-01-03
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多