我在Unix文件系统上有一个奇怪的文件。文件名中似乎有一些特殊字符,但是我无法将其删除。即使我没有直接在rm
命令中写名字(而是我写了ls | rm
),也会收到错误消息,指出该文件不存在。下面是我在互联网上进行几次搜索后尝试使用的一些命令,以调试问题。
您对如何删除它有任何建议吗?该系统是AIX 7.1。我也尝试过使用rm
和perl
脚本(仅列出所有文件并从文件夹中删除所有内容),但没有一个起作用。我也无法将文件夹移动到/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.
以下屏幕截图:
答案 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
)