sironekotoroの日記

Perl で楽をしたい

業務に役立つPerl 第5章 ファイルとディレクトリを自由に操作する

基本的なファイルとディレクトリ操作

  • モジュールを利用していく
  • ファイルの指定には絶対パス

move

  • File::Copy モジュールを使うのが好ましい
  • 標準関数であるrenameはファイルシステムを超えた移動に対応していないため
use File::Copy 'move';  
my $from = 'temp1107_01.pl';  
my $to = '../';  
move($from,$to) or die qq{Can't move "$from" to "$to":$!};  

copy

use File::Copy 'copy';
my $from = 'temp1107_01.pl';
my $to = 'temp1107_03.pl';
copy($from,$to) or die qq{Can't copy "$from" to "$to":$!};

unlink(削除)

my $file = 'temp1107_03.pl';
unlink $file or die qq{Can't remove "$file":$!};

mkdir

  • 第二引数にパーミッションを指定する事ができる
  • 同名のディレクトリが存在すると失敗するので、ディレクトリがない事を確認してから作成
my $dir = "test";
unless ( -d $dir ) {
    mkdir ($dir,0755) or die qq{Can't create directory "$dir":$!};
}

rmdir

  • ディレクトリの中にファイルがある場合には削除できない。
    • File::Pathモジュールのrmtree関数を使用する
my $dir = "test";
rmdir $dir or die qq{Can't remove directory "$dir":$!};

mkpath 複数階層のディレクトリ作成

  • File::Pathモジュール
  • 第二引数には作成したディレクトリの一覧を表示するかどうかを指定できる
  • 第三引数にはパーミッションの指定ができる
use File::Path 'mkpath';
my $dir = 'dir1/dir2';
mkpath ($dir,1,0755);```

## rmtree 複数階層のディレクトリ削除
- 中にファイルが残っていても削除する

use File::Path 'rmtree'; my $dir = 'dir1/dir2'; rmtree $dir;

## glob,ディレクトリハンドル ファイル名一覧の取得
- glob関数では一部の日本語ファイル名の取得が出来ない事がある(!)
  - ぐぐると、Windows環境なんかでうまく動かないらしい
- opendir

## ファイル名に関する処理
- File::Basename 'basename'
  - 絶対パスから末尾のファイル名を取得
- File::Basename 'dirname' 
  - 絶対パスからディレクトリ名を取得
- File::Parse
  - ファイル名と絶対パスを取得可能だけど、パス名は最後に / が付くので注意
- File::Spec 'catfile'
  - ファイル名の連結をOSに応じた形で行う
  - メソッドで呼び出す

use File::Spec; my $dir = '/home/yours/log'; my $file = 'cpu.log'; my $file_abs = File::Spec->catfile($dir,$file); say $file_abs;

## $0 スクリプト名
## FindBin::Bin スクリプトのパス

use FindBin; say $FindBin::Bin