尝试删除文件时“没有这样的文件或目录”,但该文件存在?

我正在尝试删除通过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 )如何显示奇怪的文件名。
  1. 使用find并检查输出:

    如果找不到该文件,则稍微缩短搜索词*qyxdshyikfr* ,例如: *qyxds**fishing*

     sudo find . -maxdepth 1 -type f -name "*qyxdshyikfr*" 
  2. 如果没问题,请在步骤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没有提示我完整的文件名…最后一个数字丢失了,我没有找到它….