下層ファイルを特定ディレクトリに集めるスクリプトを書いてみた。
画像収集とかで複数のディレクトリに分散して置かれてしまったファイルを同一ディレクトリに移動させつつ一意の番号で名称変更をする。
画像収集とかで複数のディレクトリに分散して置かれてしまったファイルを同一ディレクトリに移動させつつ一意の番号で名称変更をする。
#!C:/Perl/bin/perl.exe
use strict;
use warnings;
use File::Copy;
# 移動元対象ディレクトリを指定
my $dir = q|C:/dummy|;
# 移動先ディレクトリ指定
my $mv_dir = q|C:/all_image|;
# 再帰的にファイル検索して一時ファイルに出力
my $tmp_file = q|./tmp|;
system("dir $dir /s /b > $tmp_file");
# 一時ファイルから読み込み -> 配列に格納
my @array_list = ();
open(FH,"$tmp_file") or die;
while(){
$_ =~ s/[
]//g;
push(@array_list,$_);
}
close(FH);
# 一時ファイル削除
unlink($tmp_file);
# 指定拡張子のみフィルタ
@array_list = grep(/(.jpg)$|(.png)$/,@array_list);
# 既存値を初期値として代入 -> 既存値が存在しない場合は 0 から開始
my $cnt = 0;
opendir(DIR,"$mv_dir") or die;
my @array_dir = readdir(DIR);
closedir(DIR);
@array_dir = grep(/(.jpg)$|(.png)$/,@array_dir);
# 昇順ソート
@array_dir = sort {$a cmp $b} @array_dir;
foreach(@array_dir){
my $fn = $` if(/.[^.]+$/,$_);
$cnt = $fn if($fn);
}
# ファイルをリネームして移動 -> シリアル番号 + 拡張子
foreach(@array_list){
$cnt = sprintf("%05d",$cnt);
my $ex = $& if(/.[^.]+$/,$_);
move("$_","$mv_dir$cnt$ex");
$cnt++;
}
exit;
コメント