fil*_*lip 4 unix linux non-ascii-characters
我在 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.
Run Code Online (Sandbox Code Playgroud)
截屏

您的文件名包含一个破折号\xe2\x80\x93;这不是连字符减号-(unicode U+002D HYPHEN MINUS,也在ASCII中),而是Unicode中的U+2013 EN DASH。也许你的文件名包含其他奇怪的字符(那么你需要找到哪些字符)。
首先尝试使用ls(1)命令列出该文件,而不使用globbing(阅读有关path_resolution(7) ...)。还可以考虑在该命令上使用strace(1)。还尝试了解通配符是做什么的。这意味着一些(或类似的东西)。我认为它有效(也许需要一些引用)。确切地了解如何正确工作。然后使用代替只是为了确定(有时,可能是别名,所以你需要禁用它,也许通过输入代替) lsecho * | od -cxils ./\xe2\x80\x93ls ./\xe2\x80\x93 | od -cxils -llsls/bin/lsls
您可以通过复制/粘贴那个奇怪的名称来删除它,或者在使用 适当更改工作目录cd后,也许使用
rm ./\xe2\x80\x93\nRun Code Online (Sandbox Code Playgroud)\n\n该命令的最后一个字符(复制/粘贴d)是 Unicode U+2013 EN DASH;如何准确输入短破折号 Unicode 字符是一个不同的故事(它可能取决于您的桌面环境、终端模拟器、窗口管理器、键盘布局、本地化)。在 Linux 桌面上,charmapGUI 实用程序(来自 Debian 或 Ubuntu 软件包gucharmap)可以提供帮助。您可以使用鼠标选择该字符(在数千个其他 unicode 字符中)并将其复制/粘贴到 UTF-8 中。
如果您的目录有几个条目,您可以尝试
\n\n rm -rif .\nRun Code Online (Sandbox Code Playgroud)\n\n该/bin/rm命令将提示您输入每个条目(或者rm -if *如果您不想进入子目录,请尝试)。
如果顽皮文件是其目录中唯一的文件(当然不包括 和.条目..;请使用 进行检查ls -al),您可以使用rm -rf该目录并重新创建该目录mkdir
如果你的 shell 被很好地配置为支持Unicode 字符(不仅仅是字节或 ASCII),你可以尝试rm -i ./?
如果没有其他办法,您甚至可以编写一个小型 C 程序,在(破折号的UTF-8编码)上调用remove(3)或rename(2)(并检查它是否已成功) 。如果您需要以编程方式扫描奇怪的目录(以找到确切的奇怪名称),请考虑nftw(3)或opendir(3),使用stat(2)等在readdir(3)上循环...或者在脚本语言,例如Python。您可以使用一些 GUI 文件管理器执行相同的操作。"\\342\\200\\223"
2018年,我们到处都有UTF-8。如果您的桌面和本地化错误地没有使用 UTF-8,您需要更正它。请参阅locale(7)。
\n\n您还可以使用printf(1)命令来获取该奇怪的字符(该printf命令在POSIX 中)。所以该命令rm -v $(printf "\\342\\200\\223")应该可以工作(在 AIX 上,rm可能不是 GNU 命令,所以你不能rm -v只使用rm)
| 归档时间: |
|
| 查看次数: |
4164 次 |
| 最近记录: |