dirnameはFile::Basenameモジュール、mkpathはFile::Pathモジュールに含まれるのでこれらのモジュールを読み込んでおく。dirnameでファイルパスのディレクトリ部分を切り出し、mkpathで再帰的に多階層ディレクトリを作っている。
#!/usr/bin/perl use strict; use warinigs; use File::Basename; use File::Path; my $filename = '/path/to/old/file'; my $filename_new = '/path/to/new/file'; eval { mkpath(dirname($filename_new)); }; die "ERROR:mkpath, $@" if $@; rename $filename, $filename_new;
/path/to/newが存在しているときは毎回作ろうとするけど、存在していればエラーにならない。mkpath呼び出す前にファイルテスト演算子で存在チェックしたほうがいいのかな?