Функция open завершилась с ошибкой нет такого файла или каталога

Обновлено: 02.07.2024

Тем не менее, когда я ls в директории файл указан и он также указан в моем ftp-клиенте. Я попытался создать файл с тем же именем, и я получаю два файла с одинаковым именем.

Я могу открыть файл, который предположительно не существует, но я все еще не могу удалить его. Я также попытался перезагрузить свой сервер. Есть идеи, в чем может быть проблема? Я использую 64-битную версию Ubuntu, но не думаю, что это 32/64-битная проблема. Я должен также отметить, что я удалил много других файлов png, загруженных тем же PHP-скриптом.

Вывод при попытке rm

Я попытался создать файл с тем же именем, и я получаю два файла с одинаковым именем.

Это означает, что при отсутствии повреждения файловой системы у вас есть два файла с двумя разными именами, которые выглядят одинаково из-за непечатаемых символов или символов, которые выглядят одинаково в вашем наборе символов / шрифте. --escape возможность ls Ваш друг в таких случаях, как и такие инструменты, как cat -v ,

Так тоже есть rm -i -- *

TL;DR: запустить ls -1b найти имя файла, скопировать строку, в которой оно появляется, и дать его rm ,

Как и предполагали другие, скорее всего, это связано с ограничениями в способе ls - и некоторые другие программы, включая клиентское и серверное программное обеспечение - по умолчанию обрабатывают странные имена файлов, например, содержащие управляющие символы. Ваш успех с ответом JdeBP убедительно свидетельствует о том, что так оно и было, хотя и до этого было бы неплохо.

За ls когда стандартный вывод является терминалом, ? символы печатаются на своих местах. Так что, если вы не пьяный ls вывод любой другой команды (или перенаправление ее в журнал для просмотра), возможно, ваше имя файла не содержит управляющих символов. Но есть и другие проблемные символы - например, имя файла содержит конечные пробелы.

Это поведение ls может сбивать с толку, но не является ошибкой, может быть явно переопределено пользователем (см. ниже).

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

Я испытал такого рода вещи через ftp я несколько раз, в том числе для файлов, имена которых содержат завершающие пробелы. (То, что это не сработало, было связано с ошибкой в ​​моем ftp-клиенте.) Даже когда вы вручную создаете файл, в зависимости от того, как вы его создаете, иногда довольно легко случайно вставить конечный пробел или другой пробел, который может выглядеть как пространство, хотя это не так.

Это ситуация, когда ls -1b (или же dir -1 ) пригодится:

  • -1 говорит ls показать одну запись в строке. Таким образом, не возникает путаницы в том, где заканчивается одно имя файла и начинается другое. Это удобно для файлов со странными именами.
  • -b говорит ls печатать escape-последовательности для любых специальных символов. Выход из ls -b могут быть скопированы и вставлены буквально в команду, без добавления кавычек: все проблемные символы уже заключены в кавычки таким образом, что оболочка распознает их такими, какие они есть.

Предостережение только одно: если последний символ в строке \ скопируйте один символ после этого, так как это означает \ цитирует пробел.

Вы можете запустить ls -1b просто так, или вы можете передать ему шаблон оболочки (например, ls -1b qyx* ). Globbing может или не может найти файл, в зависимости от того, присутствуют или нет управляющие символы (или другие странные символы) в той части имени, которая появляется в шаблоне glob.

Скопировав \ версия имени файла, данного вам ls Вы можете вставить это в команду. Вам не нужно изменять его вручную каким-либо образом. В вашем случае, если вы хотите удалить файл, введите rm введите пробел, вставьте строку и нажмите Enter .

Я пытаюсь создать файл tar.gz с помощью следующей команды:

Затем он начинает создавать файлы (много файлов в папке), но затем я получаю следующую ошибку:

Я не вижу описания этой ошибки, что это значит?

Удалить - из vcfz вариантов. tar не нужен дефис для опций.

Аргументом для -f опции является дефис z . Таким образом, команда пытается выполнить архивирование dvr_rdk_v1.tar.gz и вызывается в dvr_rdk архиве z . Без дефиса семантика параметров изменяется, так что следующий аргумент в командной строке, то есть имя файла вашего архива, становится аргументом для f флага.

Также проверьте разрешение на запись в каталог, из которого вы выполняете команду.

Это не нуждается в дефисах, но они не должны быть проблемой, они просто необязательны @MichaelMrozek На самом деле удаление - действительно имеет значение, потому что GNU tar - это странно. Аргументы опции не могут быть связаны с первым аргументом, когда он не начинается с a - , поэтому аргумент to f является следующим аргументом tar , и, следовательно tar vcfz dvr_rdk_v1.tar.gz , эквивалентен tar -v -c -f dvr_rdk_v1.tar.gz -z . Я также понял, удастся ли мне удалить z или j сжатие архива будет успешным даже при - включенном. Когда я добавляю дефис, он включается, он обрабатывает последний символ в опции как «файл». В результате я получаю j или z в виде архивного файла, если я использую эту опцию -cvfz или -cvfj . Сводка: если «f» встречается как опция, отличная от последней, команда не будет выполнять то, что предполагалось. Я не понимаю, как Gnu не может добавить предупреждение, когда обнаруживает такую ​​серьезную и легко обнаруживаемую проблему. Я просто потратил 40 минут на отладку этой странности. Этот, должно быть, потратил сотни тысяч человеко-часов производительности.

-f Параметр должен непосредственно предшествовать имя файла. Итак, используйте tar -vczf filename.tar.gz вместо -vcfz

Ах, это объясняет, почему команда, которую я использую, пытается создать сжатый архивный файл, который вызывается j или z с этими командами -cvfj и -cvfz соответственно.

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

f
Используйте первый файловый операнд (или второй, если b уже указан) в качестве имени архива вместо системно-зависимого значения по умолчанию

Хотя правила синтаксиса включают это:

Рекомендация 5.
Один или несколько параметров без аргументов-параметров, за которыми следует не более одного параметра, который принимает аргумент-параметр, должны приниматься при группировании за одним разделителем '-'.

Репутация: 1
Всего: 109

Если из командной строки я подаю команду

То всё классно отрабатывает.
Если же я КОПИРУЮ ( ) эту же строку в скриптик, то у меня получается фигня.

user posted image

Программистами не рождаются, - это родовая травма.

Репутация: нет
Всего: 3

Репутация: 1
Всего: 19

А shell-то один и тот же используется в терминале и как обработчик скрипта?

Репутация: 1
Всего: 109

в скрипте я указал sh, а вот в консоли какой по умолчанию. Не помню.

user posted image

Программистами не рождаются, - это родовая травма.

Репутация: 34
Всего: 317

не рекомендуется юзать пробелы, и делать двойное вложение раскрытия команд:

(баш может и съел бы это, но большинство скриптов бегут из-под /bin/sh)
кроме того, пробелы в именах ни черта читабельности не дают.

рекомендуется следовать принципу KISS (Keep It Simple, Stupid)

флажок v, тоже на фиг не упал. иначе надо вывод в /dev/null.
и проверять результат этой команды - тоже дядя будет.

Репутация: 1
Всего: 109

Добавлено через 1 минуту и 13 секунд

user posted image

Программистами не рождаются, - это родовая травма.

Репутация: 1
Всего: 19

Репутация: 34
Всего: 317


ты прав. я не знаю почему, но мне показалось (или я както криво скопипастил), что было по-другому, так:

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

Репутация: 1
Всего: 109

bilbobagginz, вот я иногда не понимаю, когда ты шутишь, а когда серьёзно говоришь.

user posted image

Программистами не рождаются, - это родовая травма.

Репутация: 34
Всего: 317

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

Репутация: 1
Всего: 19

Репутация: нет
Всего: нет

Репутация: 1
Всего: 109

Вместо 3-х строк

Всё работает.
Всем спасибо!

bilbobagginz, тебе особенно!

user posted image

Программистами не рождаются, - это родовая травма.

Репутация: 34
Всего: 317

может код повторять не надо, все-таки одно и тоже делаешь 3 раза:

Репутация: 1
Всего: 109

А это я немного поиздевался.

user posted image

Программистами не рождаются, - это родовая травма.

Правила форума "Linux/UNIX: Администрирование"



Этот форум предназначен для решения вопросов по администрации *n?x-систем, в частности по настройке сложных сетей и обслуживанию серверного оборудования.
  • Вы должны соблюдать правила форума.
  • Помните: какой вопрос, такой и ответ. Прежде чем задать вопрос прочитайте вот эту статью на форуме CIT.
  • Оскорблять запрещается.
  • Религиозные войны в Религиозных войнах.
  • Общение "просто так" в Клубе юнуксоидов. В отличие от многих других разделов, здесь разрешается сдержанно оффтопить и юморить в тему.

За интересные статьи, находки, решения, программы и просто реальную помощь будут ставиться + в репу).

В данный момент этот раздел модерируют nerezus, nickless, powerfox, pythonwin, Imple и ZeeLax. Если вы хотите помочь нам, пишите в ПМ и мы обсудим.

[ Время генерации скрипта: 0.1458 ] [ Использовано запросов: 21 ] [ GZIP включён ]

FileNotFoundError: [Errno 2] Нет такого файла или каталога

не удается открыть файл manage.py: [Errno 2] Нет такого файла или каталога | Решено

Я пытаюсь открыть файл CSV, но по какой-то причине python не может его найти.

Вот мой код (это простой код, но я не могу решить проблему):

  • 2 является address.csv в той же папке, что и ваш код Python (.py)? Вы используете относительный путь. Если это не так, вам нужно указать полный путь, например C:\folder\folder\address.csv
  • если бы вы могли опубликовать точную ошибку, было бы легко ответить.
  • 3 @Cyber ​​Файл не относится к каталогу, содержащему исходный код. Это относительно рабочего каталога. По совпадению эти каталоги могут быть одинаковыми, но важно быть точным.
  • Забыл прописать разрешение, после этого добавляю "wb" и работает нормально. Благодарность

Когда вы открываете файл с именем address.csv вы говорите open() функция, что ваш файл находится в текущем рабочем каталоге. Это называется относительным путем.

Чтобы дать вам представление о том, что это означает, добавьте это в свой код:

Это напечатает текущий рабочий каталог вместе со всеми файлами в нем.

Другой способ сказать open() функция, в которой находится ваш файл, использует абсолютный путь, например:

Вы используете относительный путь, что означает, что программа ищет файл в рабочем каталоге. Ошибка сообщает вам, что в рабочем каталоге нет файла с таким именем.

Попробуйте использовать точный или абсолютный путь.

  • хорошо, это работает, но что, если вы хотите распространить код, чтобы люди могли его использовать? вы не можете ожидать, что абсолютный путь сработает в этом сценарии, верно?
  • @AbhishtaGatya, в этом случае вам нужно настроить переменные среды для чтения текущего рабочего каталога!

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

Читайте также: