删除带有特殊字符的文件

问题描述 投票:3回答:2

我在Unix文件系统上有一个奇怪的文件。它似乎在文件名中有一些特殊字符,但我无法将其删除。即使我不直接在rm命令中写入名称(而且我改为使用ls | rm),我收到一个错误,该文件不存在。下面是我在互联网上进行一些搜索后试过的一些命令,以便调试问题。

您对如何移除它有什么建议吗?该系统是AIX 7.1。我也试过rmperl脚本(只是列出所有文件并删除文件夹中的所有内容),但没有一个工作。我也无法将文件夹移动到/tmp,我得到同样的错误。

谢谢!

[root@server] ls -1b | od -bc
0000000  342 134 062 060 060 134 062 062 063 012
           ▒   \   2   0   0   \   2   2   3  \n
0000012
[root@server]$ ls -li
ls: 0653-341 The file ./– does not exist.
total 0
[root@server]$ ls
–
[root@server]$ ls | od -bc
0000000  342 200 223 012
           ▒ 200 223  \n
0000004
[root@server]$ rm *
rm: –: A file or directory in the path name does not exist.

截图如下:

rm failure

linux unix non-ascii-characters
2个回答
3
投票

一个相对安全的方法是用inodes列出文件'ls -i然后用find . -maxdepth 1 -type f -inum $inum -delete删除你需要的那个($inum是要删除的inode)。

感谢你在Unix上! ❤


1
投票

您的文件名包含en-dash ;这不是连字符 - 减号-(unicode U+002D HYPHEN MINUS,也在ASCII),但U+2013 EN DASH中的Unicode。也许你的文件名包含其他奇怪的字符(然后你需要找到哪些)。

首先尝试列出该文件,不使用globbing,使用ls(1)命令(阅读path_resolution(7) ...)。考虑在strace(1)命令上使用ls。还可以尝试使用echo * | od -cxi来了解globbing的用途。这意味着一些ls ./–(或类似的东西)。我认为它的工作原理(可能需要一些quoting)。找到如何让ls ./– | od -cxi正常工作。然后使用ls -l而不仅仅是ls来确定(有时,ls可能是aliased,所以你需要禁用它,可能通过键入/bin/ls而不是ls

你可以通过复制/粘贴这个奇怪的名字来删除它,或者在用working directory适当改变你的cd之后删除它,也许是

rm ./–

该命令的最后一个字符(copy/pasted)是Unicode U + 2013 EN DASH;如何准确输入en-dash Unicode字符是一个不同的故事(它可能取决于您的桌面环境,终端模拟器,窗口管理器,键盘布局,本地化)。在Linux桌面上,charmap GUI实用程序(来自Debian或Ubuntu软件包gucharmap)可以提供帮助。您可以使用鼠标选择该字符(在数千个其他unicode字符中)并以UTF-8复制/粘贴它。

如果您的目录有几个条目,您可以尝试

  rm -rif .

并且/bin/rm命令将提示您输入每个条目(或者如果您不想在子目录中下载,则尝试只使用rm -if *)。

如果顽皮文件是其目录中唯一的文件(当然不包括...条目;请查看ls -al),您可以rm -rf该目录并使用mkdir重新创建该目录

如果你的shell很好地配置为Unicode字符上的glob(不仅仅是字节或ASCII),你可以试试rm -i ./?

如果没有别的办法,你甚至可以写一个小的C程序,在remove(3)(en-dash的rename(2)编码)上调用"\342\200\223"UTF-8(并检查它是否成功)。如果您需要以编程方式扫描您的奇怪目录(以找到确切的奇怪名称),请考虑nftw(3)opendir(3),使用readdir(3)等在stat(2)上循环...或者使用脚本语言(如Python)编写代码。你可以使用一些GUI文件管理器做同样的事情。

在2018年,我们有UTF-8 everywhere。如果您的桌面和本地化错误地使用了UTF-8,则需要更正它。见locale(7)

您也可以使用printf(1)命令来获取那个奇怪的角色(在POSIX中printf命令is)。所以命令rm -v $(printf "\342\200\223")应该工作(在AIX上,rm可能不是GNU的,所以你不能只使用rm -v rm

© www.soinside.com 2019 - 2024. All rights reserved.