在 bash 上处理 $'\346' 等特殊字符

Handling special characters like $'\346' on bash

我有许多包含 $'1'$'6' 等字符的文件。我还没有弄清楚如何在 bash 上引用这些文件。我如何使用 mvsed 更改他们的名字?

当我运行ls时,出现其中一个文件,例如显示为:

'根'$'6''%8B'$'0''.html'

在这种情况下,大多数用户会希望使用 convmv 来转换此类文件名的编码。

但是,由于您真的不知道或不关心原始文件名应该是什么,而只是想要一个可逆的转换以使名称更容易处理,您可以将所有文件重命名为它们字节的十六进制转储:

export LC_ALL=C
for f in *
do
  mv -- "$f" "$(printf '%s' "$f" | od -t x1 -An | tr -cd 'a-f0-9')"
done

这将例如将文件 '根'$'6''%8B'$'0''.html' 转换为 e6a0b9e6253842a02e68746d6c