ファイルのコピーをする場合は、File::Copyというモジュールを使うのが良い。



1
2
3
4
use File::Copy;
my $from = "/user_dir/hoge/fuga.txt";
my $to = "/user_dir/fuga/hoge.txt";
copy($from, $to) or die "Can not copy `$from` to `$to`.";


ただし、コピーするためのフォルダ(ディレクトリ)が必要。

上の例の場合は、user_dirにfugaというディレクトリがないとコピーに失敗する。



Webで運用するようなCGIの場合は、あらかじめディレクトリを作成しておいて、バックアップや一時ファイルを作ったりするので機能的には十分ではある。

ただ、ローカルでファイル管理をしようとした時などは、これだとかなり面倒だ。

ディレクトリごとコピーする簡単な方法はないものか?

…という需要はあると思うのだが、なかなかうまい方法が見つけられない。

とりあえず、File::Pathというモジュールを使うとできるようだが、もっと簡単な方法もあるかもしれない。



1
2
3
4
5
6
7
use File::Copy;
use File::Path;
my $from = "/user_dir/hoge/fuga.txt";
my $to = "/user_dir/fuga/hoge.txt";
(my $to_dir = $to) =~ s|([^/]*?)$||;
mkpath($to_dir);
copy($from, $to) or die "Can not copy `$from` to `$to`.";


mkpathは致命的なエラーを吐いて死ぬのでエラー処理は特にしなくてもOK。

あと、作ったディレクトリを知りたい場合は、



1
my @dir = mkpath($to_dir);


とすれば、@dirに作ったディレクトリのパスが入る。



とにかく、これでファイルの操作も簡単だ。