カラクリサイクル

『輝かしい青春』なんて失かった人の雑記

ファイル名から記号とかを取り除くスクリプトを書いた

概要: ファイル名から記号とか機種依存文字を取り除くスクリプトを書いた


Windows専用だったりするけど、

  1. ファイル名に含まれる全角英数を半角英数に
  2. ファイル名に含まれる半角かなを全角かなに
  3. ファイル名から半角英数と一部の記号、平仮名、片仮名、漢字以外を削除

を実行するスクリプトを書いた。

以下スクリプト。

#!perl

use strict;
use warnings;
use utf8;

use File::Find::Rule;
use File::Copy;
use Encode qw( find_encoding decode );
use Unicode::Japanese;

my $dir = shift @ARGV or die "Usage: $0 {dir}";
my $enc = find_encoding('cp932');

print "rename.pl - setup\n";

my @files = File::Find::Rule->file
                            ->in( $dir );

print "rename.pl - start\n";

for my $file ( sort @files ) {
    my $uni = Unicode::Japanese->new( $enc->decode( $file ) );

    # 全角英数を半角英数に
    $uni->z2hNum;
    $uni->z2hAlpha;

    # 半角平片を全角平片に
    $uni->h2zKana;

    my $str = decode( 'utf8', $uni->get );
    # 半角英数/全角ひらがな/全角カタカナ/漢字以外を削除
    $str =~ s{[^a-zA-Z0-9\-_/. \p{InHiragana}\p{InKatakana}\p{Han}]}{}gs;

    my $path = $enc->encode( $str );

    if ( $file ne $path ) {
        print "${file} -> ${path}\n";
        move( $file, $path ) or die "$!";
    }
}

print "rename.pl - finish\n";

まあcp932とか指定してる部分を他の文字コードに変更すれば、MacとかLinuxでも使えるかも知れない。

で、このスクリプトなんで書いたかって言うと、最近NASを買おうかと思っていて、 バックアップ機能について調べてたら一部の文字が含まれてたりするとバックアップが失敗します、 みたいな事が書いてあったので、問題の出そうな文字を除去したいなぁと言うことで書いた。

まあこのスクリプトで問題が出そうな文字は除去できるはず、だと思う。 まあ実際に試してないから本当かどうかは分からんけど。

で、どのNASを買うかが決まらないんだよなぁ。色々あって迷ってるっていう。