尝试删除文件时“无此文件或目录”,但是该文件存在吗?


21

我正在尝试删除通过PHP脚本上传到服务器的png图像。每当我尝试通过ftp和终端将其删除时,都会收到错误消息

No such file or directory

但是,当我ls在目录中时,该文件将列出,并且它也将在我的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 -l从目录中,也充分rm命令和输出..
heemayl

@heemayl总计224 -rw-r--r-- 1 www-data www-data 222838 5月13日04:14 qyxdshyikfr_fishing_timeout.png -rw-r--r-- 1根272年5月14日06:54 upload.php rm:无法删除“ qyxdshyikfr_fishing_timeout.png”:没有此类文件或目录
DevinFrench

1
@DevinFrench,请编辑您的问题以添加信息。
muru

您从哪个目录运行rm命令?
heemayl,2015年

1
@Samuel为什么这会提示文件系统问题?该unlink调用将始终无法找到不存在的文件。当我strace在系统上运行该命令时(知道我没有该文件),它会产生类似的输出。我不认为这表示有文件系统问题!正如其他答案中所建议的那样,由于文件名显示qyxdshyikfr_fishing_timeout.png方式的限制,文件的名称似乎与名称稍有不同,并且看起来只是相同的可能性更大ls
伊莱亚·卡根

Answers:


21

我试图创建一个具有相同名称的文件,但最终得到两个具有相同名称的文件。

那说,没有文件系统损坏,您有两个文件有两个不同的名字出现在同一个,因为这看起来是一样的字符集/ FONT非打印字符或字符。该--escape选项ls是你在这种情况下的朋友,是工具,如cat -v

所以也是 rm -i -- *

进一步阅读


我是文件的创建者,也是上载的文件名。没有人试图破坏我的服务器,因为我是唯一知道upload.php完整路径的人rm -i -- *
DevinFrench,2015年

3
@DevinFrench如果此答案解决了您的问题,请单击“增加投票”计数下的标记,以将其标记为已接受的答案,以便将来的用户可能知道此解决方案对您有用。
kos 2015年

1
有人可以解释rm -i -- *命令吗?
user3731622

据我了解:通过-i 将提示您删除每个文件。--before会*选择所有文件,无论它们的名称是否包含特殊字符。参考:https
//explainshell.com/explain

16

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*)。根据是否在文件名模式中出现的名称部分中存在控制字符(或其他怪异字符),是否会发现文件乱七八糟。

复制了\所给您的文件名加引号的版本后ls,您可以将其粘贴到命令中。您无需手动进行任何修改。如果您要删除文件,请键入rm,键入一个空格,粘贴该行,然后按Enter

进一步阅读:


1
非常酷的-bthx =)和+1
AB

我在OP中遗漏的是当我在ftp客户端中创建一个具有相同名称的文件时,当我尝试删除遇到问题的第一个文件时,它将删除我创建的新文件。这就是为什么我不认为涉及任何特殊字符的原因,并且我仍然不知道自从使用以来该特殊字符是什么rm -i -- *
DevinFrench 2015年

@DevinFrench多余的字符是文件名末尾的空格。它仍然在ls输出中,但是只有在单击“编辑”时才能在文本模式下看到。
2015年

@Izkata大家好!我应该考虑检查一下。当我在编辑历史记录中展开修订版3时,它也会出现(完整的文件名(包括尾随空格)以绿色突出显示,因此可以辨认)。您所说的是迄今为止最明确,最正确的解释-如果您发布了一个答案来说明它来自尾随空格,您是如何知道的以及用什么命令将删除该文件(如果OP仍然有此文件) ,我知道我会投票赞成。
卡根

@EliahKagan完成,带有图片
Izkata 2015年

3
  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
    

1
我建议不要简单地使用的动作,而不是rm通过管道通过名称从findto进行调用。也没有必要。不太重要的是,除了明显有帮助的地方,我建议省略。例如,假设如果OP想要删除的条目原来是一个符号链接,那么他们仍然希望找到它并且仍然想要删除它。该操作不会递归破坏目录;您的命令也不会,因为您没有。因此,您不会通过不使用来意外打乱整个(非空)文件夹。xargsfind-deletesudo-type f-deleterm-r-type
伊莱亚·卡根

好我再说一遍
AB

就我而言,甚至find ... -delete说“无法删除……没有这样的文件或目录”
停止危害莫妮卡

1

详细转载,摘自我对以利亚的回答的评论

该问题是不可见的,但是如果您知道要查找的内容,则可以看到该问题:文件名末尾包含一个空格。因为您复制/粘贴了整个ls输出,所以可以在问题中看到它是突出显示输出,还是编辑帖子并将光标移到末尾,或者(如Eliah所指出的)查看编辑历史记录中的差异。我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

使用tab完成也必须完全回避了这个问题,在这里,因为是bash足够聪明,正确逃生空间(通常这也是一个好习惯,可以大大加快键入路径的速度)

例如,如果我键入rm f<tab>,它将自动完成到rm foo\<space><space>,如上面代码块中的最后一个示例所示。


我特别提到复制/粘贴ls输出,因为一次在StackOverflow上发生了类似的事情(这就是我想寻找的全部原因):有人在他们的代码中得到了不可打印的字符,这是有人弄清楚它的唯一原因是因为该用户也在发布问题时也复制/粘贴了该代码,而不是重新键入他们的代码
Izkata 2015年

0

有一次,我创建了一个文件以root身份打开Nautilus,但是从nautilus看到的文件名是“ File Browser(root)”,然后当我尝试删除as

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

我得到的唯一答案是:“ rm:无法删除'File Browser(Root).desktop':没有这样的文件或目录”

然后当我运行时:

$ ls -l

我看到/记住文件名实际上是“ Nautilus-root.desktop”

所以我跑:

$ sudo rm "Nautilus-root.desktop"

为我工作,希望对您有所帮助!


0

所以我遇到了这个问题,这些东西都不适合我。有效的方法是创建一个名称完全相同的文件。这是一个名为Example.1.2.3的文件夹,因此我创建了一个新文件夹,并将其命名为与不会删除的文件夹完全相同的文件夹。旧文件夹消失了,我删除了新文件夹。


0

rsync用于在Mac上备份我的Pictures目录并在Ubuntu上读取它之后,我遇到了类似的情况。有两个名称不同但内容相同的文件(实际上是目录)。我将其中一个删除到了“废纸rash”(使用Nautilus),但是即使从命令行也无法删除另一个。它会说:

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

用ls -i -l检查inode编号后,发现两个目录具有相同的inode编号。看起来像一个硬链接...

解决方案非常简单-右键单击图标清空垃圾箱。之后,两个目录都消失了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.