【问题标题】:How to remove file with special characters? [duplicate]如何删除带有特殊字符的文件? [复制]
【发布时间】:2018-09-21 07:36:49
【问题描述】:

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

截图

【问题讨论】:

  • 不是最有见地的解决方案,但您是否尝试通过(gui)文件管理器删除文件?
  • 使用 bash/Aix 这对我有用:/bin/touch $'\342'; ls -l $'\342'; /bin/rm $'\342'; ls -l $'\342' 请注意,不清楚您是使用 Linux 还是 Aix。
  • @filip:不要评论你自己的问题。 Edit您的问题以改进它(这是必要的)。不提供屏幕截图,只提供命令和输出(在 StackOverflow 上,每行前面需要四个空格来呈现它们)
  • 我可以用这个命令创建这样一个文件:LC_ALL=C touch $(printf '\342\200\223') 并用这个命令删除它:LC_ALL=C rm $(printf '\342\200\223')

标签: linux unix non-ascii-characters


【解决方案1】:

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

感谢您使用 Unix! ❤

【讨论】:

  • 你确定-inum 在POSIX find 中吗?我不知道!
  • @BasileStarynkevitch - 我在 Linux、Cygwin 和 Solaris 上进行了检查,所以几率很大。
  • @flip - 作为下一个实验,我会尝试一个小型 C 程序和调试器,如果您仍然需要深入了解它。
  • 我设法使用“find . -inum $inode -exec rm {} \;”尝试通过 inode 删除并且 find 说文件“状态”无效,无论这意味着什么。
  • 非常感谢!我设法创建了一个以换行符开头的文件,这是删除它的唯一方法。
【解决方案2】:

您的文件名包含一个短划线;这不是连字符减号-(unicode U+002D HYPHEN MINUS,也在ASCII),而是U+2013 EN DASHUnicode。也许你的文件名中包含其他奇怪的字符(那么你需要找到哪些)。

首先尝试使用ls(1) 命令 列出该文件,而不使用globbing(阅读path_resolution(7)...)。还可以考虑在该ls 命令上使用strace(1)。也可以尝试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;如何准确输入破折号 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 ./?

如果没有其他方法,您甚至可以编写一个小 C 程序,在 "\342\200\223"(en-dash 的 UTF-8 编码)上调用 remove(3)rename(2)(并检查它是否成功)。如果您需要以编程方式扫描您奇怪的目录(以找到 exact 奇怪的名称),请考虑 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

【讨论】:

  • 我试过了:rm ./– rm: ./–: 路径名中的文件或目录不存在。
  • 我也试过了:[root@server]$ rm $(printf "\342\200\223") rm: –: 路径名中的文件或目录不存在。
  • 所以,您不在包含该文件的正确目录中。您应该使用 cd 更改它
  • 那么你给我们的文件名不正确。确保某些ls ./– 正常工作。也许还有其他字符,或者你需要一些 shell 引号
  • 我给你的文件是正确的。
猜你喜欢
  • 2018-05-31
  • 2014-05-27
  • 2015-04-11
  • 2023-01-19
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多