I ♥ WordPress

[時間割:Perl]『ミニマルPerl』その15
2009/01/16 01:00 posted by kunkichi

木曜日は「Perl」です。今回からfindコマンドです。これまでやってきた grep、sed、awk については、Perlで置き換えれるように見てきたのだけど、find の場合は「Perl との組み合わせ」でいろいろやっていきます。

ミニマルPerl Unix/LinuxユーザのためのPerl習得法
Tim Maher
オライリージャパン
売り上げランキング: 96883
  • ファイルのテスト機能。シェルやtestコマンドで使うようなやつです。
    例:sample.txt が通常のファイルだったら。 -f sample.txt and print;例:sample.binが通常のファイルじゃなかったら。! -f sample.bin and print;ファイル名を省略して$_にすることもできます。
    例:$_ が 通常のファイルだったら。-f and print $_;例:$_が通常のファイルじゃなかったら。! -f and print $_;
  • これ以外にもテスト機能の指定はできます。findじゃできないような、テキストとバイナリのテスト、実行ユーザの権限に準じたアクセス権でのテスト、などなど。
  • find と Perl を組み合わせでは、find で一連のパスを作っておいて、フィルタをかけるのにPerlを使います。$ find . -type -name '*.dat' |
    > find /var/log -mtime -3
    これにPerlでフィルタをかけます。> | perl -wnl -e '/-f and -T/ and print;'上記の例では、findでカレントディレクトリ配下の”*.dat”というファイル名で、かつ、最終更新日が3日以内のファイル名をリストアップして、最後にPerlで、通常ファイル、かつ、テキストファイルのものだけを抽出しています。
  • 名前のマッチングとかはPerlの強力な正規表現をつかったほうがらくちんです。$ find . -type -f | perl -wnl -e '/.+¥.dat$/ and print;'ちなみにfindの場合は以下。$ find . -type f -name "*.dat"ファイル名のマッチングが一つだけしかないなら、それほどでもないけど、以下のように複数のファイル名のマッチとかの場合は、括弧で囲んだ上、エスケープして、複数のファイル名の条件は、-oでつなぐ、そして、ファイル名のマッチにはワイルドカードレベルのものしか使えない、となり結構面倒。$ find . -type f \( -name '*.dat' -o -name '1¥.*' -o '*34*' \)
  • フルパスでファイルのリストがあって、この中から、特定の「ファイル名だけ」でマッチをしたい場合、以下のように-aオプションでパスを分解して使うと良い。$ find . -type f | perl -wnla'/' -e '$F[-1] =~ /abc$|*cde*|^123/ and print;'
  • 逆に特定の「ディレクトリ配下」という指定もできる。$ find . -type f | perl -wnl -e '-T and m:data/\w+\.dat:i and print;'-Tでテキストファイル限定、mを使って正規表現中にパスを表すスラッシュをいちいちエスケープしないように、iで大文字小文字無視。こういうのはfindだけではちょっと難しいのでかなり便利。

とりあえず今日はここまで。

コメント&トラックバック

トラックバックURL





このページの先頭へ