unidec_renamer.pl 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Date: 29 October 2012
  5. # Edit: 23 June 2013
  6. # https://github.com/trizen
  7. # Unidecode filename renamer.
  8. # Ex: fișier.mp3 -> fisier.mp3
  9. # Usage: unidec_renamer.pl -r <dirs>
  10. use utf8;
  11. use 5.005;
  12. use strict;
  13. use warnings;
  14. use File::Find qw(find);
  15. use Getopt::Std qw(getopts);
  16. use File::Basename qw(basename);
  17. use Text::Unidecode qw(unidecode);
  18. use File::Spec::Functions qw(catfile catdir splitdir);
  19. my %opts;
  20. getopts('r', \%opts);
  21. my @dirs = grep { -d } @ARGV;
  22. @dirs || die "usage: $0 [-r] <dir>\n";
  23. binmode(STDOUT, ':utf8');
  24. sub unidec_rename_file {
  25. my ($filename, $new_filename) = @_;
  26. if (not -e $new_filename) {
  27. rename $filename, $new_filename
  28. or do { warn "Can't rename: $!\n"; return };
  29. }
  30. else {
  31. warn "'$new_filename' already exists! Skipping...\n";
  32. }
  33. return 1;
  34. }
  35. my @dirs_for_rename;
  36. find {
  37. no_chdir => 1,
  38. wanted => sub {
  39. my $filename = basename($File::Find::name);
  40. utf8::decode($filename);
  41. my $new_name = unidecode($filename);
  42. if ($filename ne $new_name) {
  43. my $dir = $File::Find::dir;
  44. utf8::decode($dir);
  45. print "[", qw(DIR FILE) [-f $_], "] $filename -> $new_name\n";
  46. my $new_filename = (-f _) ? catfile($dir, $new_name) : do {
  47. push @dirs_for_rename, [$_, ($dir eq $filename ? $new_name : catdir($dir, $new_name))];
  48. return;
  49. };
  50. if ($opts{r}) {
  51. unidec_rename_file($_ => $new_filename);
  52. }
  53. }
  54. },
  55. } => @dirs;
  56. if ($opts{r}) {
  57. foreach my $array_ref (
  58. map { $_->[1] }
  59. sort { $b->[0] <=> $a->[0] }
  60. map { [scalar(splitdir($_->[0])), $_] } @dirs_for_rename
  61. ) {
  62. unidec_rename_file($array_ref->[0], $array_ref->[1]);
  63. }
  64. }