如何在 Mac OS X 终端中删除包含不可打印字符的文件

如何在 Mac OS X 终端中删除包含不可打印字符的文件

可能重复:
在 OS X 中删除文件名中含有奇怪字符的文件

我有一个文件夹,里面有一个名为 Icons 的文件,文件末尾有一个附加的不可打印字符。如果我使用 -B 选项执行 ls,我可以看到不可打印的内容:

$ ls -B
$ Icon\015

如果我使用 ls -b 我会得到:

$ ls -b
$ Icon\r

我想删除文件,但找不到输入不可打印字符的方法。如果我这样做:

$ rm Icon\015

我得到:

$ Icon\015: No such file or directory

如果我做:

$ rm Icon\r

我得到:

$ Icon\r: No such file or directory

我可以删除整个文件夹,但我需要一种更通用的方法来执行此操作,因为此类文件会出现在许多用户文件夹中。

答案1

shell 会自动将每个 CR ( \r) 转换为 LF ( \n) 并执行前面的命令。但是,您可以使用echo来生成 LF 字符。所有这些都应该有效:

rm $(echo -e "Icon\r")

rm $(echo -e "Icon\015")

echo -e "Icon\r" | xargs rm

echo -en "Icon\r" | xargs -0 rm

最后一个选项应该相当强大并且能够处理所有可能的奇怪字符。

答案2

有几种方法可以在命令行中包含非打印字符。最简单的(仅限 bash)选项是$在单引号字符串前使用,这会让 bash 在字符串内进行转义替换。请注意,它可以处理几种转义序列,因此这两种方法都可以使用:

rm $'Icon\r'
rm $'Icon\015'

或者,你可以在 Control-M(又称回车键)之前键入 Control-V,它告诉 shell“我键入的下一个字符应该包含在命令中”:

rm Icon^V^M

(请注意,^V 实际上并不是命令的一部分,因此它不会在命令行上回显)。

答案3

对于一个不可打印的字符,您可以使用“?”作为通配符来表示一个字符。因此,abc?def?.zip 表示 abc1def2.zip 以及 abc!def#.zip。

相关内容