"Нет такого файла или каталога" при попытке удалить файл, но файл существует?

Я пытаюсь удалить изображение в формате png, которое было загружено на мой сервер с помощью PHP-скрипта. Всякий раз, когда я пытаюсь удалить его как через ftp, так и через терминал, я получаю сообщение об ошибке

No such file or directory

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

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

Выход для ls -l

total 224 -rw-r--r-- 1 www-data www-data 222838 May 13 04:14 qyxdshyikfr_fishing_timeout.png -rw-r--r-- 1 root root 272 May 14 06:54 upload.php

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

rm: cannot remove ‘qyxdshyikfr_fishing_timeout.png’: No such file or directory

upload.php: http://pastebin.com/z87eypTY

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

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

Так же, как и rm -i -- *

Дальнейшее чтение

ТЛ;Д-Р: Бежать ls -1b, найдите имя файла, скопируйте строку, в которой оно появляется, и передайте его rm.

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

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

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

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

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

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

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

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

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

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

Дальнейшее чтение:

  1. Воспользуйся find и проверьте выходные данные:

    Если файл не найден, то сокращение поискового запроса *qyxdshyikfr* слегка, например: *qyxds* или *fishing*.

     sudo find . -maxdepth 1 -type f -name "*qyxdshyikfr*"
  2. Если все в порядке, чем использовать find с помощью поискового запроса на шаге 1 и rm

     find . -maxdepth 1 -type f -name "*qyxdshyikfr*" -print0 | xargs -0  rm

Подробный репост, дополненный моим комментарием к ответу Элайи

Проблема невидима, но ее можно увидеть, если вы знаете, что искать: имя файла содержит пробел в конце. Потому что вы скопировали /вставили весь ls вывод, это можно увидеть в вопросе, если вы выделите вывод, или отредактируете сообщение и переместите курсор в конец, или (как указал Элиа) посмотрите на разницу в истории редактирования. Я выделил следующие ls вывод в сообщении на этом скриншоте:

Extra space

Быстрый небольшой сеанс терминала для дублирования проблемы с комментариями:

$ touch 'foo '        # Create file with a space at the end$ ls -l               # Space is not visible in ls outputtotal 0-rw-rw-r-- 1 izkata izkata 0 May 14 21:59 foo $ rm foo              # Cannot remove it when not specifying the spacerm: cannot remove ‘foo’: No such file or directory$ rm 'foo '           # Can remove it if we quote the file name and include the space$ rm foo\             # Or can escape the space to tell bash to include it as part of the filename

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

Например, если бы я набрал rm f<tab>, он был бы автоматически завершен до rm foo\<space><space>, как в последнем примере в блоке кода выше.

Итак, у меня была эта проблема, и ни одна из этих вещей не сработала для меня. Что сработало, так это создание файла с точно таким же именем. Это была папка с именем Example.1.2.3, поэтому я создал новую папку и назвал ее точно так же, как ту, которая не удалялась. Старая папка исчезла, и я удалил новую.

однажды я создал файл, чтобы открыть Nautilus от имени root, но имя файла при просмотре из nautilus было "File Browser (root)", а затем, когда я попытался удалить как

$ rm "File Browser (Root)"$ sudo rm "File Browser (Root)"$ sudo rm "File Browser (Root).desktop"

единственный ответ, который я получил, был: "rm: не удается удалить "File Browser (Root).рабочий стол": Нет такого файла или каталога"

потом, когда я убегу:

$ ls -l

я увидел / вспомнил, что имя файла на самом деле было "Nautilus-root.desktop".

так что я бегу:

$ sudo rm "Nautilus-root.desktop"

сработало для меня, надеюсь, это поможет!

У меня была похожая ситуация, после использования rsync чтобы сделать резервную копию моего Картинки каталог на Mac и чтение его в Ubuntu.Там было два файла (фактически каталога) с разными именами, но с одинаковым содержимым. Я удалил один в корзину (используя Nautilus), но не смог удалить другой, даже из командной строки. В нем говорилось бы:

$ rmdir Picturesrmdir: failed to remove 'Pictures': No such file or directory$ rm Picturesrm: cannot remove 'Pictures': Is a directory

После проверки номеров индексов с помощью ls -i -l оказалось, что оба каталога имеют одинаковый номер индекса. Похоже на жесткую ссылку...

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

@DevinFrench пожалуйста, [отредактируйте] свой вопрос, чтобы добавить информацию.

@Samuel Почему это может указывать на проблему с файловой системой? Вызов unlink всегда не сможет найти файл, который не существует. Когда я запускаю эту команду strace в моей системе, где, как я знаю, у меня нет такого файла, она выдает аналогичный результат; Я не думаю, что это указывает на *У меня * проблема с файловой системой! Кажется гораздо более вероятным, что имя файла немного отличается от qyxdshyikfr_fishing_timeout.png и просто выглядит одинаково из-за ограничений в способе отображения имен файлов ls, как предлагалось в других ответах.

Скопируйте и вставьте выходные данные ls -l из каталога, а также полную команду rm и ее выходные данные…

@heemayl
всего 224
-rw-r-r- 1 www-данные www-данные 222838 13 мая 04:14 qyxdshyikfr_fishing_timeout.png
-rw-r-r- 1 root root 272 14 мая 06:54 upload.php

rm: не удается удалить ‘qyxdshyikfr_fishing_timeout.png’: Такого файла или каталога нет

Из какого каталога вы запускаете команду rm?

@heemayl из того же каталога, что и файл

Попробуйте запустить синхронизацию и проверьте, все ли еще там файл

Вы можете использовать Bash “завершение имени файла”, чтобы сгенерировать правильное имя файла, начинающееся с “q”. Если это не удается, это означает, что первая буква не “q”, но затем вы можете использовать “rm -i *timeout.png”, чтобы удалить ее, или незначительные вариации на тему. Все это предполагает, что это единичная проблема, а не системная.

Попробуйте выполнить: lsof /path/to/file/qyxdshyikfr_fishing_timeout.png если результаты не найдены, после lsof выполните следующее и опубликуйте здесь результат: strace -ttt -F -i -s 255 rm -f qyxdshyikfr_fishing_timeout.png

Вывод из strace 1431604072.195551 [00007f12ca74e337] execve("/bin/rm", ["rm", "-f", "qyxdshyikfr - Pastebin.com