我正在尝试删除通过 PHP 脚本上传到我的服务器的 png 图像。每当我尝试通过 ftp 和终端删除它时,我都会收到错误消息
No such file or directory
Run Code Online (Sandbox Code Playgroud)
但是,当我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
Run Code Online (Sandbox Code Playgroud)
尝试时输出 rm
rm: cannot remove ‘qyxdshyikfr_fishing_timeout.png’: No such file or directory
Run Code Online (Sandbox Code Playgroud)
上传.php:http ://pastebin.com/z87eypTY
Jde*_*eBP 22
我尝试创建一个同名的文件,但最终得到了两个同名的文件。
那说,没有文件系统损坏,您有两个文件有两个不同的名字是出现在相同的看起来相同的字符集/ FONT非打印字符或字符,因为。该--escape
选项ls
是你在这种情况下的朋友,是工具,如cat -v
。
所以,也是 rm -i -- *
Eli*_*gan 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*
)。globbing 可能会也可能不会找到文件,这取决于控制字符(或其他奇怪的字符)是否出现在 glob 模式中出现的名称部分中。
复制了\
由 提供给您的文件名的带引号版本后ls
,您可以将其粘贴到命令中。您不必以任何方式手动修改它。在您的情况下,当您希望删除文件时,键入rm
,键入一个空格,粘贴该行,然后按Enter。
进一步阅读:
小智 5
所以我遇到了这个问题,但这些东西都不适合我。有效的方法是创建一个具有完全相同名称的文件。这是一个名为Example.1.2.3 的文件夹,因此我创建了一个新文件夹并将其命名为与不会删除的文件夹完全相同的名称。旧文件夹消失了,我删除了新文件夹。