删除带有特殊字符的文件

时间:2018-09-21 07:36:49

标签: linux unix non-ascii-characters

我在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

2 个答案:

答案 0 :(得分:3)

一种相对安全的方法是使用ls -i列出文件的inodes,然后使用find . -maxdepth 1 -type f -inum $inum -delete删除所需的文件($inum是要删除的索引节点)。

感谢您在Unix上! ❤

答案 1 :(得分:1)

您的文件名包含一个破折号;那不是连字符减号-(在U+002D HYPHEN MINUS中也是Unicode ASCII),而是U+2013 EN DASH中的Unicode。也许您的文件名包含其他奇怪的字符(然后您需要查找哪些字符)。

首先尝试使用globbing 命令列出没有ls(1)的文件(了解path_resolution(7) ...)。考虑在该ls命令上也使用strace(1)。也可以尝试echo * | od -cxi来了解完成了哪些工作。这意味着一些ls ./–(或类似的东西)。我想它可以工作(也许需要一些quoting)。确切找到如何使ls ./– | od -cxi正常工作。然后使用ls -l而不是ls来确保(有时ls可能是aliased,因此您需要禁用它,也许可以键入/bin/ls ls

您可以通过复制/粘贴该奇怪的名称来将其删除,或者在将working directory更改为cd之后,也许使用

rm ./–

该命令的最后一个字符(copy/paste d)是Unicode U + 2013 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字符(不仅仅是字节或ASCII)为glob,则可以尝试rm -i ./?

如果没有其他效果,您甚至可以编写"\342\200\223"remove(3)编码的小型C程序,调用rename(2)UTF-8(并检查是否成功)破折号)。如果您需要以编程方式扫描您的怪异目录(以找到精确的怪异名称),请考虑使用{{3}或nftw(3)opendir(3)上使用{{3 }}等...或使用脚本语言(例如Python)进行编码。而且,您可以使用一些GUI文件管理器执行相同的操作。

2018年,我们有readdir(3)。如果您的桌面和本地化错误地未使用UTF-8,则需要更正该错误。参见stat(2)

您还可以使用UTF-8 everywhere命令来获取该奇怪的字符(POSIX中的printf命令locale(7))。因此,命令rm -v $(printf "\342\200\223")应该可以工作(在AIX上,rm可能不是GNU,因此不能仅rm -v使用rm