ファイルの数が特定の数より少ないzipファイルをリストします


10

.zip1つのフォルダに何千ものファイルがあります。15個未満のファイルが含まれているzipファイルを見つけたいと思います。

unzip -lzipファイルの内容をリストできることは知っていますが、15ファイル未満のzipファイルの出力を作成する方法がわかりません。

回答:


14
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で参照$z
  • if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 ))ファイルをunzipでカウントし、出力から数値を抽出します(数値のみを抽出するより確実な方法は確かにありますが、私はsedそれを使用したため、@ muruのコメントを参照してください)。 15未満かどうかをテストし、15未満かどうかをテストします
  • echo "$z" 次に、ファイル名を印刷します
  • | tee small-zip-list また、出力を新しいファイルとターミナルに出力します

@Zannaに感謝します。firesスクリプトを実行しようとすると、フォルダー内のすべての.zipファイル名が常に表示されます。数字の形式を15より小さくしても、フォルダー内のすべての.zipファイルが表示されます。
yarone 2017

@yaroneすみません、スペースを逃しました!私はそれを修正しました。もう一度試してください
Zanna

6
少し使いやすいかもしれませんzipinfozipinfo -1 foo.zip | wc -lまたはzipinfo -t foo.zip | awk '{print $1}'
muru

@yarone大歓迎!:D
Zanna

+1次のいずれかを使用:awk、sed、grep;)
Nonny Moose

9

後半の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)

使い方

  1. スクリプトを空のファイルにコピーし、名前を付けて保存します get_zips.py
  2. ディレクトリと必要なファイル数(最小)を指定して実行します。例:

    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


1
Python?zipfile
muru

@muruありがとう、違います:)
Jacob Vlijm

9

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未満の場合、ファイル名を出力します。


5

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


0

zipinfoを使用してファイルの総数を取得します。

$ for f in *.zip; do \
  a=($(zipinfo -t "$f")); \
  (($a > 15)) && echo $f; done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.