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

Я пытаюсь удалить изображение 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

21
задан 15 May 2015 в 00:14

7 ответов

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

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

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

Дополнительные материалы для чтения

0
ответ дан 15 May 2015 в 00:14

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

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

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

16
ответ дан 15 May 2015 в 00:14
  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
    
0
ответ дан 15 May 2015 в 00:14

Перерегистрация подробно, расширенный из моего комментария к ответу Eliah

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

Extra space

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

$ touch 'foo '        # Create file with a space at the end
$ ls -l               # Space is not visible in ls output
total 0
-rw-rw-r-- 1 izkata izkata 0 May 14 21:59 foo 

$ rm foo              # Cannot remove it when not specifying the space
rm: 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

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

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

0
ответ дан 15 May 2015 в 00:14

однажды, я создал файл для открытия Nautilus как корня, но имя файла, когда наблюдение от наутилуса было "Файловым браузером (корень)", затем когда я пытался удалить как

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

единственный anwser, я добрался, был: "комната: не может удалить 'Файловый браузер (Корень) .desktop': Никакой такой файл или каталог"

затем, когда я работаю:

$ ls -l

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

, таким образом, я работаю:

$ sudo rm "Nautilus-root.desktop"

работал на меня, надежда, которой это помогает!

0
ответ дан 15 May 2015 в 10:14
  • 1
    драйвер, доступный в веб-сайте didn' t компилируют @chili555 – Raw One 25 August 2016 в 05:08

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

0
ответ дан 15 May 2015 в 10:14
  • 1
    Продолжите двигаться к @Pilot6' s отвечают ниже. – chili555 25 August 2016 в 05:40

У меня была аналогичная ситуация после использования rsync скопировать мой каталог Pictures на Mac и чтении его на Ubuntu. Было два файла (на самом деле каталоги) с различными именами, но наличием того же содержания. Я удалил тот к Мусору (использующий Наутилус), но не мог удалить другой, даже из командной строки. Это сказало бы:

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

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

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

0
ответ дан 23 November 2019 в 01:41

Другие вопросы по тегам:

Похожие вопросы: