Aqui está um script para corrigir nomes de arquivos cirílicos quebrados se os arquivos foram movidos do Windows para o Mac (com base em uma resposta para Reverter nomes de arquivos depois que eles foram corrompidos pelo uso de codificação diferente )
#!/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 $@;}
}'
Quero que ele renomeie apenas os arquivos no diretório de destino que tenham pelo menos um dos seguintes caracteres em seus nomes: †°Ґ£§•¶І®©™Ђђ≠
. Mas, por algum motivo, o script renomeia todos os arquivos ali: por exemplo, um nome de arquivo correto срочно.txt
é alterado para um ёЁюўэю.txt
. O que estou fazendo errado?
O caminho para minha pasta de teste é simples /Users/john/scripts/test
: sem espaços, sem caracteres cirílicos ou especiais.
O script é usado no macOS e com a versão BSD do find
.
Uma atualização dois dias após a resposta à pergunta: as versões Chazelas e Choroba do Stéphane funcionam bem para mim. A versão do Terdon ainda não funciona.