尝试删除文件时“没有这样的文件或目录”,但该文件存在?
我正在尝试删除通过PHP脚本上传到我的服务器的png图像。 每当我尝试通过ftp和终端删除它时,我都会收到错误
No such file or directory
但是,当我在dir中时,文件被列出并且它也列在我的ftp客户端中。 我尝试创建一个具有相同名称的文件,最终得到两个具有相同名称的文件。
我可以打开据称不存在的文件,但我仍然无法将其删除。 我也试过重启我的服务器。 任何想法可能是什么问题? 我正在运行64位版本的Ubuntu,但我认为它不是32/64位问题。 我还应该注意到我删除了由同一PHP脚本上传的许多其他png文件。
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
的--escape
选项是你的朋友,像cat -v
这样的工具也是如此。
rm -i -- *
进一步阅读
TL; DR:运行ls -1b
,找到文件名,复制它出现的行,并将其赋予rm
。
正如其他人所建议的那样,很可能这是由于ls
限制 – 以及其他一些程序,包括客户端和服务器软件 – 默认处理奇怪的文件名,例如包含控制字符的文件名。 你在JdeBP的回答中取得的成功强烈暗示了这种情况,尽管在此之前这是一个不错的选择。
-
对于
ls
,当标准输出是终端时,?
字符打印在他们的位置。 因此,如果您没有将ls
的输出传递给任何其他命令(或将其重定向到日志以供查看),则可能您的文件名不包含控制字符。 但是还有其他有问题的字符 – 例如,文件名可能包含尾随空格。ls
这种行为可能令人困惑但不是错误,可以被用户明确地覆盖(见下文)。 -
尝试远程访问或删除文件时,客户端或服务器软件中的错误可能会产生此类问题。
我已经多次通过
ftp
体验过这种事情 ,包括名称中包含尾随空格的文件。 (它不起作用是由于我的ftp客户端中的一个错误。)即使你自己手动创建一个文件,取决于你如何创建它,有时很容易无意中插入尾随空格或其他空格可能看起来像空格,即使它不是。
这是ls -1b
(或dir -1
)派上用场的情况:
-
-1
告诉ls
每行显示一个条目。 这样就不会混淆一个文件名结束而另一个文件名开始的位置。 这对于奇怪命名的文件很方便。 -
-b
告诉ls
打印任何特殊字符的转义序列。ls -b
的输出可以复制并粘贴到命令中, 没有添加引号 :所有有问题的字符都已经引用,导致shell将它们识别为它们。
只有一点需要注意:如果一行上的最后一个字符显示为\
,则在此之后复制一个字符,因为这意味着\
正在引用一个空格。
您可以像这样运行ls -1b
,或者可以将shell glob模式传递给它(例如, ls -1b qyx*
)。 Globbing可能会也可能不会找到该文件,具体取决于控件字符(或其他奇怪字符)是否出现在glob图案中出现的名称部分中。
复制了由ls
给出的文件名的\
_quoted版本后,您可以将其粘贴到命令中。 您无需以任何方式手动修改它。 在您的情况下,如果要删除文件,请键入rm
,键入空格,粘贴该行,然后按Enter键 。
进一步阅读:
- 10.1
ls
:列出 GNU coreutils参考手册中的目录内容 。 - 我对这个问题的回答 ,与你的问题非常不同,但很大程度上涉及
ls
(和dir
)如何显示奇怪的文件名。
-
使用
find
并检查输出:如果找不到该文件,则稍微缩短搜索词
*qyxdshyikfr*
,例如:*qyxds*
或*fishing*
。sudo find . -maxdepth 1 -type f -name "*qyxdshyikfr*"
-
如果没问题,请在步骤1和
rm
使用find
与搜索词find . -maxdepth 1 -type f -name "*qyxdshyikfr*" -print0 | xargs -0 rm
从我对Eliah的答案的评论中进行了详细的重新发布
问题是看不见的,但如果您知道要查找的内容就可以看到:文件名末尾包含一个空格。 因为您复制/粘贴了整个ls
输出,如果你突出显示输出,或者编辑post并将光标移动到最后,或者(如Eliah所指出的那样)在编辑历史记录中查看差异,可以在问题中看到。 我在此截图中的post中突出显示了ls
输出:
一个快速的小终端会话来复制问题,评论:
$ 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
使用制表符完成也会完全避开这里的问题,因为bash足够智能以正确地逃避空间(这也是一个好习惯,加速打字路径这么多) 。
例如,如果我键入rm f
,它将自动完成到rm foo\
,如上面代码块中的最后一个示例所示。
有一次,我创建了一个以root身份打开Nautilus的文件,但是从nautilus看到的文件名是“File Browser(root)”,然后当我试图删除时
$ rm "File Browser (Root)" $ sudo rm "File Browser (Root)" $ sudo rm "File Browser (Root).desktop"
我得到的唯一一个是:“rm:无法删除’文件浏览器(Root).desktop’:没有这样的文件或目录”
然后当我跑:
$ ls -l
我看到/记得文件名实际上是“Nautilus-root.desktop”
所以我跑:
$ sudo rm "Nautilus-root.desktop"
为我工作,希望它有所帮助!
所以我遇到了这个问题,这些都不适合我。 有用的是创建一个名称完全相同的文件。 它是一个名为Example.1.2.3的文件夹,因此我创建了一个新文件夹,并将其命名为与不删除的文件夹完全相同。 旧文件夹消失了,我删除了新文件夹。
我今天遇到了同样的问题…我无法移除或复制或移动或捕获第一个文件 – 2015082818。
[Jing@Jing3 hadoop-2.5.0]$ ll total 74748 -rw-rw-r--. 1 Jing Jing 39425518 May 8 16:30 2015082818 -rw-rw-r--. 1 Jing Jing 37091848 May 8 16:30 2015082819
但原因更有趣……当我尝试删除文件时,我只需输入
rm 2
然后按TAB
键,然后shell显示
rm 201508281
然后我认为shell已经给了我全名 ,所以我只按了ENTER
。 然后它只显示:
[Jing@Jing3 hadoop-2.5.0]$ cat ../201508281 cat: ../201508281: No such file or directory
这只是因为shell没有提示我完整的文件名…最后一个数字丢失了,我没有找到它….