可能重复:
在 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。