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抜けてました,@ainameありがとう.コンパイル全然通りませんでした.)
書いてて知らなかったお作法をメモ.
opendir,readdir
opendirでディレクトリを開き,readdirでディレクトリを読み込む.
opendirの使い方はこんな感じの定型文.
opendir DIR, $directory or die "opendir 失敗: $!";
ここでDIRはディレクトリハンドル名,$directoryはディレクトリ名です.
readdirの使い方はこんな感じ.
@files = readdir DIR;
これでファイル名のリストが@filesに入ってきます.
copy
その名のとおり,ファイルをコピーする関数ですが,最初にこの宣言をもってくる必要があります.
use File::Copy;
あとはコマンドプロンプト上で./rename.plとか打てば勝手にやってくれるはずです!