tech::hexagram

personal note for technical issue.

perlで簡単なリネームプログラム作ってみた

Web系プログラム言語ひよひよなので少しずつ慣れていこうかと思い,研究で使えそうだと思ったのでperlで書いたプログラムを晒してみました.

研究で,以下のようなファイルをコピーしてこんな感じにリネームするようなプログラムが必要でした.

リネームの要求仕様

変換元ファイル

<例>2011-02-10-11-23-06-00-009-09.xxx
ファイル名の規則は「YYYY-MM-DD-hh-mm-ss-GG-NNN-gg.xxx」って感じ.
最初のYYYY〜ssまでは日時を表し,GGは大グループ,NNNはただの通しナンバー,ggは小グループというあんばい.

変換後ファイル1

こういうファイルをグループとか関係なしに全部連番にする

変換後ファイル2

大グループGGごとにフォルダに振り分けて,その中で連番にしていく

ソースコード

色々あがいた結果,こんな感じになりました.

#!/usr/bin/perl

use strict;
use File::Copy;

my $dir='/directory_from/';
my $all_counter=0;
my $num_of_link=XX;
my @each_counter;
for(my $i=0;$i<$num_of_link;$i++){ $each_counter[$i]=0; }

opendir DH,$dir or die "$dir:$!";

while(my $file = readdir DH){
    next if $file =~ /^\.{1,2}$/;
    print $file,"\n";

    #copy to rename_all
    my $src_file=$dir.$file;
    my $dst_all_file='/directory_to_all/'.$all_counter.'.xxx';
    copy($src_file,$dst_all_file);

    my $link_number;
    #copy_to_rename_each
    my $file_number=substr($file,20,2);
    for(my $i=0;$i<$num_of_link;$i++){
	if($i==$file_number){
	    $link_number=$i;
	}
    }
    my $dst_each_file='/directory_to_each/'.$file_number.'/'.$each_counter[$link_number].'.xxx';
    print $dst_each_file ,"\n";
    $each_counter[$link_number]++;
    copy($src_file,$dst_each_file);

    $all_counter++;   
}

(use strict抜けてました,@ありがとう.コンパイル全然通りませんでした.)
書いてて知らなかったお作法をメモ.

opendir,readdir

opendirでディレクトリを開き,readdirでディレクトリを読み込む.
opendirの使い方はこんな感じの定型文.

opendir DIR, $directory or die "opendir 失敗: $!"; 

ここでDIRはディレクトリハンドル名,$directoryはディレクトリ名です.

readdirの使い方はこんな感じ.

@files = readdir DIR; 

これでファイル名のリストが@filesに入ってきます.

copy

その名のとおり,ファイルをコピーする関数ですが,最初にこの宣言をもってくる必要があります.

use File::Copy;

あとはコマンドプロンプト上で./rename.plとか打てば勝手にやってくれるはずです!