#はじめに
大学の研究で膨大な量のファイルを扱う機会があったので、Perlでファイルのコピーを自動化してみました。
今回は指定した名前のファイルを選択し、ディレクトリにコピーする方法です。
以下のようなディレクトリ構成となっています。
xdir
|-xfile1
|-xfile2
|-xfile3
xxdir
|-xxfile1
|-xxfile2
#実行環境
- Ubuntu 18.4
- Perl v5.26.1
#ソースコード
ファイル名はFiles_cpy.plとします。
実行はスクリプトのあるディレクトリから
$perl Files_cpy.pl [コピーするファイル名]
で行います。
Files_cpy.pl
#!/usr/bin/perl
use strict;
use warnings;
use Cwd;
use constant{
TARGET_DIRECTORY => "コピー先のディレクトリ名",
};
my $name = $ARGV[0]; #コピーするファイル名
my $CurrentDir = Cwd::getcwd(); #カレントディレクトリを取得
DeployFiles($CurrentDir); #メイン処理
##DeployFiles
sub DeployFiles{
my $CurrentDir = shift; #ひとつの引数を受け取る
my @list = ();
#カレントディレクトリの一覧を取得
opendir(DIR, $CurrentDir) or die("Can't get directory.:$CurrentDir($!)");
@list = readdir(DIR);
closedir(DIR);
foreach my $dir (sort @list){ #辞書順にソート
next if($dir =~ /^\.{1,2}$/); #カレントディレクトリ"."とひとつ上の階層のディレクトリ".."は処理しない
next if($dir eq TARGET_DIRECTORY); #コピー先のディレクトリ内のファイルは処理しない
#ディレクトリのみにマッチ
if(-d "$CurrentDir/$dir"){ #ディレクトリの存在を確認
CopyFiles($CurrentDir, $dir);
}
}
}
##CopyFiles
sub CopyFiles{
my $CurrentDir = $_[0];
my $TargetDir = $_[1];
my @list = ();
# ディレクトリ内のディレクトリ・ファイルを取得
opendir(DIR, "$CurrentDir/$TargetDir") or die("Can't get directory.:$CurrentDir($!)");
@list = readdir(DIR);
closedir(DIR);
foreach my $file (@list){
next if($file =~ /^\.{1,2}.*$/);
next if($file =~ /~/);
#ファイルのみにマッチ
if(-f "$CurrentDir/$TargetDir/$file"){
if($file =~ /$name/){
#cpコマンドを利用
my $cp = "cp $CurrentDir/$TargetDir/$file $CurrentDir/".TARGET_DIRECTORY;
system($cp) == 0 or die "Can't execute $cp: $!"; #ターミナル上での実行
}
}
}
}
#参考
以下の記事を参考にさせて頂きました。
https://www.eda-inc.jp/post-987/