Данный файл или каталог отсутствует? Но файл существует!

Я скачал игру (Shank), но файл bin не запускается. Ошибка, которая отображается при попытке запустить исполняемый файл:

bash: ./shank-linux-120720110-1-bin: No such file or directory

9 ответов

Вероятно, вы пытаетесь запустить 32-разрядный двоичный файл в 64-разрядной системе, в которой не установлена ​​32-разрядная поддержка.

В трех случаях вы можете получить сообщение "Нет такого файла или каталога":

  • Файл не существует. Я предполагаю, что вы проверили, что файл существует (возможно, потому что оболочка завершает его).
  • Файл с таким именем существует, но это свисающая символическая ссылка.
  • Файл существует, и вы даже можете прочитать его (например, команда file shank-linux-120720110-1-bin отображает что-то вроде "ELF 32-bit LSB исполняемый файл…"), и все же, когда вы пытаетесь выполнить его, вам говорят, что файл не существует.

Сообщение об ошибке в этом последнем случае, по общему признанию, сбивает с толку. Это говорит о том, что отсутствует ключевой компонент среды выполнения, необходимый для запуска программы. К сожалению, канал, по которому сообщается об ошибке, имеет место только для кода ошибки, а не для этой дополнительной информации, которая действительно виновата в среде выполнения. Если вам нужна техническая версия этого объяснения, прочитайте сообщение Получение "Не найдено" при запуске 32-разрядного двоичного файла в 64-разрядной системе.

file Команда скажет вам, что это за двоичный файл. За некоторыми исключениями, вы можете запустить только двоичный файл для архитектуры процессора, для которой предназначен ваш выпуск Ubuntu. Основным исключением является то, что вы можете запускать 32-битные (x86, aka IA32) двоичные файлы в 64-битных (amd64, aka x86_64) системах.

В Ubuntu до 11.04 для запуска 32-разрядного двоичного файла в 64-разрядной установке необходимо установить ia32-libs пакет Установить ia32-libs, Возможно, вам придется установить дополнительные библиотеки (в противном случае вы получите явное сообщение об ошибке).

Так как 11.10 (oneiric) представила поддержку multiarch, вы все равно можете установить ia32-libs, но вы можете выбрать более детальный подход, достаточно получить libc6-i386 Установите libc6-i386 (плюс любая другая необходимая библиотека).

64-битные системы Ubuntu Multiarch

Следуйте этому ответу, только если вывод 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

Чтобы запустить 32-битный исполняемый файл в 64-битной многоархивированной системе Ubuntu, вы должны добавить i386 архитектура, а также вы должны установить libc6:i386,libncurses5:i386,libstdc++6:i386 эти три библиотечных пакета.

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
./file-name

Чтобы расширить ответ @Gilles, есть как минимум три сценария, приводящие к этой ошибке:

  1. Файл не существует.
  2. Файл существует, но является висячей символической ссылкой.
  3. Файл существует (например, file команда работает), делая загадочные сообщения об ошибках. Это может означать, что есть проблема с загрузчиком.

Категории проблем с загрузчиком:

  1. Загрузчик исполняемого файла не существует. Вы можете проверить это с помощью команды file и посмотреть, существует ли загрузчик. Например

    file lmgrd
    lmgrd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-lsb-x86-64.so.3, for GNU/Linux 2.6.18, stripped
    

    уведомление interpreter /lib64/ld-lsb-x86-64.so.3; если этот файл не существует, вам необходимо установить его. Для данного конкретного загрузчика 16.04 ответ оказался sudo apt-get install lsb,

  2. Проблемы с загрузчиком скрипта (см. Этот ответ).

  3. Отсутствуют общие библиотеки - используйте ldd <file-name> проверить наличие "не найденных" библиотек. Смотрите этот ответ для получения дополнительной информации.

Загрузчик не существует может быть из-за несоответствия 32/64 бит или по другой причине. Могут быть и другие ошибки загрузчика, о которых я не знаю.

Вот расшифровка стенограммы, показывающая немного больше о природе проблемы и о том, как ее исправить, начиная с 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 ...

Я не знаю, существует ли систематический способ определения правильных библиотек для установки. Есть немного догадок, отображающих сообщения об ошибках на имена пакетов (помогает завершение табуляции).

Установив deb для 32-битной системы, я понял, что мне не хватает некоторых библиотек (в дополнение к 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 для выполнения.

Google направил меня на эту страницу. Моя проблема была отдаленно связана с названием этой ветки, поэтому я публикую ее здесь для будущих посетителей, таких как я:

Это одна из самых странных проблем:

$ 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')]

И вот как я смог победить это.

Как размещено в /questions/602394/dannyij-fajl-ili-katalog-otsutstvuet-no-fajl-suschestvuet/602413#602413

sudo apt-get install lsb

решил проблему

Ни один из приведенных выше ответов не сработал для меня, потому что у переводчика было неправильное разрешение.

Я написал подробный ответ здесь , объясняя, как решить эту проблему.

Спасибо этому человеку, который поделился своим опытом с другими решениями здесь. благодаря ему я смог решить эту проблему.

Подводя итог, как @steeldriver, возникла проблема с интерпретатором. компоновщик дает моей программе [/lib/ld64.so.1] интерпретатор ELF, но этот путь вообще не существует, и я проверил его:

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

После этого я проверил путь интерпретатора в моей установке Ubuntu:

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

поэтому решение состоит в том, чтобы создать ссылку одного из этих интерпретаторов на несуществующий путь интерпретатора:


Теперь мы еще раз перепроверяем несуществующий интерпретатор, чтобы убедиться, что он еще не существует:

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

Теперь эта команда вернула /lib/ld64.so.1 вместо «несуществующий файл». так что проблема была решена, и я мог успешно запустить ./main

Итак, в итоге вам нужно создать ссылку одного из этих интерпретаторов на несуществующий путь интерпретатора, выполнив следующую команду в терминале (Ctrl+ Alt+ T):

      sudo ln -s /lib64/ld-linux-x86-64.so.2 /lib/ld64.so.1
Другие вопросы по тегам