perlでmkdir -pする

File::Path というモジュールに入っている、mkpath というのを使います。

#!/usr/bin/perl
use File::Path;
use strict;

my @hoge = mkpath ('/home/noriko/test/perl/hoge/moge/a/a/a/');
foreach(@hoge){
  print $_ . "\n";
}

mkpath は、作成したディレクトリを配列にして返します。

これを実行すると

noriko@caelum:~/test/perl$ perl mkpass.pl
/home/noriko/test/perl/hoge
/home/noriko/test/perl/hoge/moge
/home/noriko/test/perl/hoge/moge/a
/home/noriko/test/perl/hoge/moge/a/a
/home/noriko/test/perl/hoge/moge/a/a/a/

ディレクトリがなければ作成してくれます。

同じスクリプトをもう一度実行すると、すでにディレクトリがあるので、何も返ってきません。

パーミッションないところとかに作ろうとすると、エラーになります。

mkdir /var/log/hoge: 許可がありません at mkpass.pl line 5

エラーをフックしたい場合は、eval を使いましょう。

#!/usr/bin/perl
use File::Path;
use strict;

my @hoge;

eval{
  @hoge = mkpath ('/home/noriko/perl/hoge/moge/moge');
};

if($@){
  print "error: " . $@;
}

foreach(@hoge){
  print $_ . "\n";
}

こんな感じにしてみます。/home/noriko/perl/hoge/moge のパーミッションは、

noriko@caelum:~/test/perl/hoge$ ls -lart
合計 16
drwxr-xr-x 2 root     root     4096 2009-10-17 23:38 moge

755 で、オーナーが root ですので、root でない人は書き込みできません。スクリプトを実行すると、

noriko@caelum:~/test/perl$ perl mkdir.pl
error: mkdir /home/noriko/perl/hoge/moge/moge: 許可がありません at mkdir.pl line 8

のように表示されます。

team mukya 2009