#!/usr/bin/env perl use 5.014; use warnings; use Encode qw/decode_utf8 encode_utf8/; use Unicode::Normalize qw/NFC/; use File::Basename qw/basename dirname/; use File::Copy qw/move/; use File::Spec; for my $file (@ARGV) { die "file not found: $file\n" unless -e $file; my $dir = dirname $file; opendir my $dh, $dir or die $!; my $fname = decode_utf8 basename $file; # readdir しないと 生のファイル名が取れない # (NFC/NFDどちらでもファイルの実体を解決できるため) while (my $f = readdir $dh) { my $fbase = decode_utf8 $f; # NFC subroutine expects perl string if (NFC($fname) eq NFC($fbase)) { try_move( File::Spec->catfile($dir, $f) ); } } } sub try_move { my $file = shift; $file = decode_utf8 $file; my $nfc = NFC($file); if ($nfc ne $file) { my $raw_nfc = encode_utf8 $nfc; move($file, $nfc) or die "Move $raw_nfc failed: $!\n"; printf "moved: %s", $raw_nfc; } }