最近このコーナーでは、UNIXやWindowsのコマンドを呼び出したり、その結果を得ることに注力しています。まとめると
  • バッククォート(``)でコマンドを囲むとコマンドの戻り値をリストで返す
  • 「open "|-", コマンド名」でコマンドに対してパイプライン出力する
  • 「open "-|", コマンド名」でコマンドからパイプライン入力する
 さて、今日はファイルの一括処理をまとめます。

Pearl Shell Monument Doha

globとファイルテスト演算子

 まず、ファイルテスト演算子を使うとファイルの情報確認が出来ますね。以下は超・冗長なUNIXのlsコマンド(Windowsではdirコマンド)です。

#! /usr/local/bin/perl
# fileCheck.pl -- ファイルテスト演算子のテスト

use strict;
use warnings;
use 5.10.0;

for my $name (glob "*") {
  say "$nameは...";
  if (-f $name) {
   say "ファイル(File)である";
  } elsif (-d $name) {
   say "ディレクトリ(Directory)である";
  } elsif (-l $name) {
    say "シンボリックリンク(Link)である";
  }
  if (-r $name) {
   "読み込み可能(Readable)である";
  } else {
   "読み込み可能(Readable)でない";
  }
  if (-w $name) {
   "読み込み可能(Writable)である";
  } else {
   "読み込み可能(Writable)でない";
  }
  if (-x $name) {
   say "実行可能(eXecutable)である";
  } else {
   say "実行可能(eXecutable)でない";
  }
  say "ファイルサイズ(Size)は以下のとおり:", (-s $name);
  say "修正(Modified)からの日数は以下のとおり:", (-M $name);
  say "最終アクセス(Accessed)からの日数は以下のとおり:", (-A $name);
  say "作成(Created)からの日数は以下のとおり:", (-C $name);
}

 glob関数はワイルドカードを渡すとファイル/ディレクトリ一覧を返す関数です。

glob ("*.pl") # カレントディレクトリの拡張子がplの一覧
glob ("/usr/local/bin/*.") # 絶対パス指定
glob ("../Dropbox/*.exe") # 相対パス

ファイル一括処理

 以下はファイルを処理する関数です。

ファイルの削除(Mac/UNIXだとrm、Windowsだとdel)

  unlink $ファイル名;
  unlink @ファイル名の配列;
  unlink glob("*.pl"); # カレントディレクトリの*.plを一括削除

 deleteはハッシュ要素の削除ですね。

ファイルの名前変更(Mac/UNIXだとmv、Windowsだとren)

  rename "古い名前", "新しい名前";
  rename "古い名前" => "新しい名前";

 =>はハッシュ定義の(key1 => value1, key2 => value2)でも使う「派手なカンマ」(見た目が違うだけでカンマと同じ役割)ですが、renameの引数で使うと強烈に見やすいですね。

ファイルの移動(Mac/UNIXだとmv、Windowsだとmv)

  use File::Copy qw(move);
  …
  move "古い名前" , "新しい名前";
  move "古い名前" => "新しい名前";

 File::Copyモジュールをuseすることが必要です。
 renameでもできるけど、パーティションをまたぐと失敗するのでこっちを使いましょうだそうです。
 qw(move)はFile::Copyモジュールからメモリーの節約のためにmoveメソッドだけを持ってくる使い方で、全部ドバーンと持ってくる場合は書かないことも出来ます。

ファイルのコピー(Mac/UNIXだとcp、Windowsだとmove)

  use File::Copy qw(copy);
  …
  copy "古い名前" , "新しい名前";
  copy "古い名前" => "新しい名前";

 moveメソッドとcopyメソッド2つを持ってきたい時は

  use File::Copy qw(copy move);

と書けます。

 個人的にはバッチファイルやシェルスクリプトはもうほとんど使いません。Perlにおまかせです!