回答:
for z in *.zip; do if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 )); then echo "$z"; fi; done
これは、.zip15個未満のファイルを含むファイルを(ターミナルで)stdoutにリストするため、リストファイルを作成する場合は、teeアウトまたはリダイレクトできます。ここではより読みやすく、最後にリストファイルを作成し、ターミナルで印刷します
for z in *.zip; do
if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 )); then
echo "$z"
fi
done | tee small-zip-list
for z in *.zip終わるファイルをループ.zip変数で表され、それぞれに何かをする、zで参照$zif (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 ))ファイルをunzipでカウントし、出力から数値を抽出します(数値のみを抽出するより確実な方法は確かにありますが、私はsedそれを使用したため、@ muruのコメントを参照してください)。 15未満かどうかをテストし、15未満かどうかをテストしますecho "$z" 次に、ファイル名を印刷します| tee small-zip-list また、出力を新しいファイルとターミナルに出力します zipinfo:zipinfo -1 foo.zip | wc -lまたはzipinfo -t foo.zip | awk '{print $1}'
後半のpython使用してオプション、pythonさんをzipfile(@muruにより示唆されるように、感謝!)、
#!/usr/bin/env python3
import os
import sys
from zipfile import ZipFile
dr = sys.argv[1]
for zp in [os.path.join(dr, f) for f in os.listdir(dr) if f.endswith(".zip")]:
if len(ZipFile(zp, "r").namelist()) < int(sys.argv[2]):
print(zp)
get_zips.pyディレクトリと必要なファイル数(最小)を指定して実行します。例:
python3 /path/to/get_zips.py /full/path/to/directory_with_zips 15
スクリプト:
.zipディレクトリ内のファイルを一覧表示します。
for zp in [os.path.join(dr, f) for f in os.listdir(dr) if f.endswith(".zip")]:ファイル内を調べ、ファイル数をカウントします。
if len(ZipFile(file, "r").namelist()) < n:
print(file)
リストされた項目の数がより小さい場合にのみ、ファイル(+パス)を印刷しますn。
awkの使用:
for i in ~/path/to/your/folder/*.zip; do if (( $(unzip -l $i | awk 'END {print $(NF-1)}') < 15 )); then echo "$i"; fi; done
または、スクリプトで行うこともできます。
スクリプトzip.shを作成する
#!/bin/bash
for i in ~/path/to/your/folder/*.zip; do
if (( $(unzip -l $i | awk 'END {print $(NF-1)}') < 15 )); then
echo "$i"
fi
done
ホームフォルダーに保存して、chmod +x zip.shターミナルで実行可能にし、ターミナルから実行します./zip.sh
ここではif (( $(unzip -l $i | awk 'END {print $(NF-1)}') < 15 ))、
unzip -l $i それぞれのzipファイルとその出力からのファイル数をカウントします、
awk 'END {print $(NF-1)}' 数値のみをカウントするgrep、それが15未満の場合、ファイル名を出力します。
Perlには、zipアーカイブを処理するためのパッケージもありますArchive::Zip。以下のスクリプトは、zipファイルをコマンドライン引数として取り、アーカイブ内のファイルの名前と数をコマンドライン出力に提供します。
#!/usr/bin/env perl
use strict;
use warnings;
use Archive::Zip;
foreach (@ARGV){
my $fh = Archive::Zip::->new();
if (my $error = $fh->read($_)){
die "Read error:" . $_;
}
if($fh->numberOfMembers() < 15 ){
printf("%s\t%d\n",$_,$fh->numberOfMembers());
}
}
テスト走行:
$ ./count_zip_contents.pl *.zip
129804-findmac.py.zip 1
Re%3a_China_and_East_Asia_%5bHIS-1250-010_31616.201730%5d%3a_Team_up_for_East_Asian_History_class.zip 4
University_Formal_jpg&tif.zip 5
indicator-places-master.zip 4
lab 5.zip 8
for z in *.zip; do if (( $(unzip -Z1 "$z" | wc -l) < 15 )); then echo "$z"; fi;done