Translate

2012年4月8日日曜日

File::Path

■ディレクトリの作成
カレントディレクトリにfoo/bar/bazなディレクトリ階層を作成したい時

下記構成
├── foo
│   └── bar
│   └── baz

#!/usr/bin/perl
use strict;
use warnings;
use utf8;

mkdir foo
mkdir foo/bar
mkdir foo/bar/baz
のように上位ディレクトリから順に作成していくことになる。

File::Pathを使うと1行ですむ。
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use File::Path qw/make_path/;

make_path('foo/bar/baz'); #ver 2.06以降


■ディレクトリの削除
下記ディレクトリ構造でfooディレクトリを削除したい時
├── foo
│   ├── bar
│   │   ├── baz
│   │   │   └── sample.txt
│   │   └── sample.txt
│   └── sample.txt
最下層のディレクトリ内のファイルを削除⇒ディレクトリ削除の順で削除する必要がある。
File::Findeモジュールのfinddepth関数で最下層のディレクトリからアクセスして削除していく
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use File::Find;
use FindBin;

finddepth(\&deleteAll, 'foo');

sub deleteAll{
  #フルパスじゃないと削除できなかったのでスクリプトのパスを取得しておく
  my $BasePath = $FindBin::Bin . '/';
  if(-f $_){ unlink $BasePath . $File::Find::name || die $! };
  if(-d $_){ rmdir  $BasePath . $File::Find::name || die $! };                          
}


File::Pathを使うと1行ですむ。
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use File::Path qw/remove_tree/;

remove_tree('foo'); #ver 2.06以降


v2.00より前とv2.06より前とそれ以降でインターフェースが異なります。
perl -MFile::Path -le 'print "$File::Path::VERSION"'
等で、確認した上で利用する必要があります。

v2.06以降の場合
use File::Path qw(make_path remove_tree);

  make_path('foo/bar/baz', '/zug/zwang'); #複数作成したい場合コンマで区切る
  make_path('foo/bar/baz', '/zug/zwang', {
      verbose => 1,  #1を指定すると実行時コマンドを出力する
      mode => 0711, #アクセス権限を指定  デフォ:0777
  });

  remove_tree('foo/bar/baz', '/zug/zwang');
  remove_tree('foo/bar/baz', '/zug/zwang', {
      verbose => 1,
      error  => \my $err_list, #エラー情報
  });

0 件のコメント:

コメントを投稿