argius note

プログラミング関連

複数のアーカイブファイル内を一度に検索

ローカルファイルシステムに散らばったアーカイブファイル内のファイルから、指定した拡張子のファイルを探したい。アーカイブの種類は拡張子で特定できる前提として、"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$'