Я пытаюсь удалить изображение 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
ls -l
из каталога, а также полнуюrm
команду и ее выходные данные.rm
команду?unlink
Вызов всегда будет не в состоянии найти файл , который не существует. Когда я запускаю этуstrace
команду в моей системе, где я знаю, что у меня нет такого файла, она выдает похожий вывод; Я не думаю , что указывает на то у меня есть проблема файловой системы! Кажется гораздо более вероятным, что имя файла немного отличается отqyxdshyikfr_fishing_timeout.png
простого и выглядит одинаково из-за ограничений способаls
отображения имен файлов, как это предлагается в других ответах.Ответы:
Это означает, что при отсутствии повреждения файловой системы у вас есть два файла с двумя разными именами, которые выглядят одинаково из-за непечатаемых символов или символов, которые выглядят одинаково в вашем наборе символов / шрифте.
--escape
Вариантомls
является вашим другом в таких случаях, как и инструменты , такие какcat -v
.Так тоже есть
rm -i -- *
дальнейшее чтение
источник
rm -i -- *
.rm -i -- *
команду?-i
подскажет вам перед удалением каждого файла.--
before*
выбирает все файлы независимо от того, содержат ли их имена специальные символы. Ссылка: https://explainshell.com/explain?cmd=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.Дальнейшее чтение:
ls
: Список содержимого каталога в справочном руководстве по GNU coreutils .ls
(иdir
) отображает странные имена файлов.источник
-b
спасибо =) и +1rm -i -- *
.ls
выводе вопроса, но его можно увидеть только в текстовом режиме, когда вы нажмете «изменить».Используйте
find
и проверьте вывод:Если файл не найден, следует
*qyxdshyikfr*
немного сократить поисковый запрос, например:*qyxds*
или*fishing*
.Если все в порядке, используйте
find
термин поиска на шаге 1 иrm
источник
rm
по имени по трубе отfind
доxargs
, я рекомендую просто использоватьfind
«s-delete
действия. Такжеsudo
не нужно. Менее существенно, я предлагаю опустить,-type f
кроме случаев, когда это явно полезно. Предположительно, если запись, которую ОП хочет удалить, оказалась символической ссылкой, например, они все равно захотят ее найти и все равно захотят ее удалить.-delete
Действие не будет рекурсивно затирать каталог; и не будет вашейrm
команды, так как у вас нет-r
. Таким образом, вы не собираетесь случайно ударить целую (непустую) папку здесь, не используя-type
.find ... -delete
говорит: «не могу удалить ... Нет такого файла или каталога»Перепечатка подробно, дополнена моим комментарием к ответу Елии
Проблема невидима, но ее можно увидеть, если вы знаете, что искать: имя файла содержит пробел в конце. Поскольку вы копируете / вставляете весь
ls
вывод, это можно увидеть в вопросе, выделите ли вы вывод или отредактируете сообщение и переместите курсор в конец, или (как указал Элия) посмотрите на разницу в истории редактирования. Я выделилls
вывод в посте на этом скриншоте:Небольшая сессия терминала для дублирования проблемы с комментариями:
Использование завершения табуляции также полностью обошло бы проблему, так как bash достаточно умен, чтобы правильно выходить из пробелов (в общем, это также хорошая привычка, так сильно ускоряет ввод путей) .
Например, если бы я набрал текст
rm f<tab>
, он автоматически завершился быrm foo\<space><space>
, как в последнем примере в блоке кода выше.источник
ls
вывода, потому что нечто подобное произошло в StackOverflow один раз (и это единственная причина, по которой я подумал об этом): кто-то получил непечатный символ в своем коде, и единственная причина, по которой кто-то понял это. потому что этот пользователь также копирует / вставляет вместо повторного ввода своего кода при публикации вопросаоднажды я создал файл, чтобы открыть Nautilus от имени пользователя root, но имя файла при просмотре из nautilus было «Обозреватель файлов (root)», а затем при попытке удалить как
я получил только один ответ: «rm: невозможно удалить« File Browser (Root) .desktop »: такого файла или каталога нет»)
потом, когда я бегу:
я видел / помнил, что имя файла, на самом деле, было "Nautilus-root.desktop"
так что я бегу:
работал для меня, надеюсь, это помогает!
источник
Так что у меня была эта проблема, и ничего из этого не помогло мне. Работало создание файла с точно таким же именем. Это была папка с именем Example.1.2.3, поэтому я создал новую папку и назвал ее точно такой же, как та, которая не будет удалена. Старая папка исчезла, а я удалил новую.
источник
У меня была похожая ситуация, после того как я сделал
rsync
резервную копию моего каталога Pictures на Mac и прочитал его в Ubuntu. Было два файла (фактически каталоги) с разными именами, но с одинаковым содержимым. Я удалил одну в корзину (используя Nautilus), но не смог удалить другую, даже из командной строки. Было бы сказать:После проверки номеров инодов с помощью ls -i -l оказалось, что оба каталога имеют одинаковый номер инода. Похоже на жесткую ссылку ...
Решение было удивительно простым - очистите корзину, щелкнув правой кнопкой мыши по значку. После этого оба каталога исчезли.
источник