这是一个脚本,用于修复文件从 Windows 移动到 Mac 时损坏的西里尔文文件名(基于对使用不同编码后文件名被乱码后的恢复文件名的回答)
#!/bin/zsh
# Usage: <script> <target directory>
# Requires Perl::Rename
find "$1" -mindepth 1 -print0 |
rename -0 -d -e '
use Unicode::Normalize qw(NFC);
use Encode qw(:all);
if ($_ =~ /[†°Ґ£§•¶І®©™Ђђ≠]/) {
my $check = DIE_ON_ERR | LEAVE_SRC;
my $new = eval {encode("UTF-8",
decode("cp866",
encode("mac-cyrillic",
NFC(decode("UTF-8", $_, $check)), $check), $check))
};
if ($new) {$_ = $new;} else {warn $@;}
}'
我希望它仅重命名目标目录中文件名中至少包含以下字符之一的文件:†°Ґ£§•¶І®©™Ђђ≠
。但由于某种原因,脚本会重命名那里的所有文件:例如,正确的文件名срочно.txt
更改为无意义的ёЁюўэю.txt
。我做错了什么?
我的测试文件夹的路径很简单/Users/john/scripts/test
:没有空格,也没有西里尔字母或特殊字符。
该脚本在 macOS 和 BSD 版本上使用find
。
问题得到解答两天后的更新:Stéphane 的 Chazelas 和 Choroba 的版本对我来说很好用。Terdon 的版本对我来说还不行。