Daftar file zip yang memiliki kurang dari jumlah file tertentu

10

Saya memiliki ribuan .zipfile dalam satu folder. Saya ingin menemukan file zip mana yang memiliki kurang dari 15 file di dalamnya.

Saya tahu bahwa unzip -lbisa daftar isi file zip tapi saya tidak tahu cara membuat output file zip yang memiliki kurang dari 15 file.

yarone
sumber

Jawaban:

14
for z in *.zip; do if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 )); then echo "$z"; fi; done

Ini mencantumkan .zipfile dengan kurang dari 15 file ke stdout (di terminal), jadi jika Anda ingin membuat file daftar, Anda bisa teekeluar atau mengarahkan. Ini dia lebih mudah dibaca, membuat file daftar di akhir serta mencetak di terminal

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

Catatan

  • for z in *.ziploop atas file yang diakhiri dengan .zipdan melakukan sesuatu untuk masing-masing, diwakili oleh variabel yang zdirujuk dengan$z
  • if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 ))buat unzip hitung file, ekstrak nomor dari output (pasti ada cara yang lebih rapi untuk mengekstrak hanya nomor, tapi saya tahu sedjadi saya sudah menggunakannya - lihat komentar @ muru untuk cara sederhana yang mungkin lebih cepat dengan banyak file) dan uji apakah kurang dari 15, dan jika ya
  • echo "$z" lalu cetak nama file
  • | tee small-zip-list juga mencetak output ke file baru, serta di terminal
Zanna
sumber
Terima kasih @Zanna saya mencoba menjalankan skrip kebakaran dan selalu menampilkan semua nama file .zip di folder, bahkan jika saya mengurangi bentuk angka 15 menjadi sesuatu yang lebih kecil, ini menunjukkan semua file .zip di folder.
yarone
@yarone sangat menyesal, saya melewatkan ruang! Saya telah memperbaikinya sekarang, saya harap, silakan coba lagi
Zanna
6
Mungkin sedikit lebih mudah digunakan zipinfo: zipinfo -1 foo.zip | wc -latauzipinfo -t foo.zip | awk '{print $1}'
muru
@yarone, selamat datang! : D
Zanna
+1 Digunakan salah satu dari yang berikut: awk, sed, grep;)
Nonny Moose
9

Opsi python terlambat, menggunakan python's zipfile, (seperti yang disarankan oleh @muru, terima kasih!)

#!/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)

Cara Penggunaan

  1. Salin skrip ke file kosong, simpan sebagai get_zips.py
  2. Jalankan dengan direktori dan jumlah file yang diinginkan (minimal), misalnya:

    python3 /path/to/get_zips.py /full/path/to/directory_with_zips 15
    

Penjelasan

Naskah:

  • daftar .zipfile di dalam direktori:

    for zp in [os.path.join(dr, f) for f in os.listdir(dr) if f.endswith(".zip")]:
  • Lihat ke dalam file dan menghitung jumlah file:

    if len(ZipFile(file, "r").namelist()) < n:
        print(file)

    Hanya mencetak file (+ path) jika jumlah item yang terdaftar lebih kecil n.

Yakub Vlijm
sumber
1
Python? zipfile !
muru
@muru terima kasih lagi, itu membuat perbedaan :)
Jacob Vlijm
9

Menggunakan 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

Atau bisa juga dengan script.

Buat skrip 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

Simpan di folder rumah & Jadikan itu dapat dieksekusi dengan chmod +x zip.shdan jalankan dari terminal./zip.sh

Di sini if (( $(unzip -l $i | awk 'END {print $(NF-1)}') < 15 )),

  • unzip -l $i itu akan menghitung jumlah file dari masing-masing file zip & dari outputnya,

  • awk 'END {print $(NF-1)}' grep yang hanya menghitung angka, jika kurang dari 15 maka akan mencetak nama file.

bunga aster
sumber
5

Perl juga memiliki paket untuk menangani arsip zip Archive::Zip,. Skrip di bawah ini mengambil file zip sebagai argumen baris perintah dan memberikan output baris perintah dengan nama dan jumlah file dalam arsip.

#!/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());
    }
}

Uji coba:

$ ./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
Sergiy Kolodyazhnyy
sumber
0
for z in *.zip; do if (( $(unzip -Z1 "$z" | wc -l) < 15 )); then echo "$z"; fi;done
pengguna1048382
sumber
perubahan kecil ke kode @ zanna "$ (unzip -Z1" $ z "| wc -l)"
user1048382
0

Dapatkan jumlah total file menggunakan zipinfo:

$ for f in *.zip; do \
  a=($(zipinfo -t "$f")); \
  (($a > 15)) && echo $f; done
bac0n
sumber