在 bash 上处理 $'\346' 等特殊字符
Handling special characters like $'\346' on bash
我有许多包含 $'1'
和 $'6'
等字符的文件。我还没有弄清楚如何在 bash 上引用这些文件。我如何使用 mv
和 sed
更改他们的名字?
当我运行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
我有许多包含 $'1'
和 $'6'
等字符的文件。我还没有弄清楚如何在 bash 上引用这些文件。我如何使用 mv
和 sed
更改他们的名字?
当我运行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