複数のアーカイブファイル内を一度に検索
ローカルファイルシステムに散らばったアーカイブファイル内のファイルから、指定した拡張子のファイルを探したい。アーカイブの種類は拡張子で特定できる前提として、"lzh""zip""tar""tar.gz""tar.bz2"を対象とする。
まず、次のようなPerlスクリプトを用意。(名前とバージョンは適当。)パスの通っているディレクトリに保存し、modeを755にしておく。ループは、whileにするとバッファリングの関係で上手く行かない。
# arls v0.0.1 my $st = 0; for (<>) { s/[\r\n]//g; if (-f) { my $file = $_; print "\@archive:$file\n"; if (/\.lzh$/i) { print qx"lha l $file"; } elsif (/\.zip$/i) { print qx"unzip -l $file"; } elsif (/\.tar$/i) { print qx"tar tvf $file"; } elsif (/\.tar\.gz$/i) { print qx"gzip -dc $file | tar tvf -"; } elsif (/\.tar\.bz2$/i) { print qx"bzip2 -dc $file | tar tvf -"; } else { print STDERR "unsupported file suffix : $file\n"; $st = 2; } } else { print STDERR "not exists : |$_|\n"; $st = 1; } } exit $st;
実行は、findとgrepを併用する。Dドライブ以下の全アーカイブを対象に、拡張子"exe"のファイルを検索。
find d:/ -iname "*.lzh" -o -iname "*.zip" -o -iname "*.tar" \ -o -iname "*.tar.gz" -o -iname "*.tar.bz2" \ | arls | grep -iP '\@archive|\.exe$'