在清理文件服务器时,我发现许多文件名中都有不需要的或非 ASCII 字符。要重命名不需要的文件名,我通常在 OSX 机器上的 zsh shell 中使用方便的 zmv 命令。
为了找到不需要的字符,我使用:LC_ALL=C find . -name '*[! -~]*'
我的查找结果在我的文件名中输出许多 Unicode 字符“COMBINING DIAERESIS”(U+0308)“ü”。(https://www.fileformat.info/info/unicode/char/0308/index.htm)。我在 OSX 上使用 x-term 256 中的 zsh,文本编码:Unicode UTF-8。我的语言环境设置/LC_CTYPE="en_DE.UTF-8")
echo -e 'u\u0308'
正确输出 ü。
find . -name '*u<0308>*'
(按预期工作 - 请注意,上一个 find 命令中的“<0308>”实际上是一个 ü,它在剪切粘贴过程中被替换到 zsh 窗口中)
如何使用 zmv 替换文件名中的 Unicode 字符(例如 u0308)?这是我目前尝试的方法:
zmv -n '(**/)(*)(#qD.)' '$f:gs/u[$(0308)]/ue'
但这似乎不起作用。
答案1
看起来将多字节字符剪切并粘贴到命令行中是可行的:
> zmv -n '**/*(#qD.)' '$f:gs/ü/ue'
mv -- f1/abcü123 f1/abcue123
mv -- f2/MüüMüM f2/MueueMueM
> zmv -n '**/*ü*(#qD.)' '${f//ü/ue}'
mv -- f1/abcü123 f1/abcue123
mv -- f2/MüüMüM f2/MueueMueM
在某些情况下,您可以使用明确的字符编码,例如在替换中:
> f=Au$'\u308'B
> print $f
AüB
> print ${f//u$'\u308'/ue}
AueB
但这似乎不起作用zmv
,可能是因为函数对输入模式的解析zmv
。