Elenca i file zip che hanno meno di un numero specifico di file


10

Ho migliaia di .zipfile in una cartella. Vorrei trovare quali file zip contengono meno di 15 file.

So che unzip -lpuò elencare il contenuto dei file zip ma non so come creare un output di file zip con meno di 15 file.

Risposte:


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

Questo elenca i .zipfile con meno di 15 file da stdout (nel terminale), quindi se si desidera creare un file elenco, è possibile teeeseguire l' output o il reindirizzamento. Qui è più leggibile, creando un file elenco alla fine e stampando nel terminale

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

Appunti

  • for z in *.zip.zippassa in rassegna i file che terminano con e fanno qualcosa per ognuno, rappresentato dalla variabile a cui fa zriferimento$z
  • if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 ))fai decomprimere contare i file, estrai il numero dall'output (c'è sicuramente un modo più ordinato per estrarre solo il numero, ma lo so sedquindi l'ho usato - vedi il commento di @ muru per un modo più semplice che potrebbe essere più veloce con molti file) e verifica se è inferiore a 15 e se lo è
  • echo "$z" quindi stampare il nome file
  • | tee small-zip-list stampa anche l'output su un nuovo file, così come nel terminale

Grazie @Zanna ho provato a eseguire lo script di incendi e mostra sempre tutti i nomi di file .zip nella cartella, anche se sto riducendo il numero del modulo 15 a qualcosa di più piccolo, mostra tutti i file .zip nella cartella.
Yarone,

@yarone così dispiaciuto, ho perso uno spazio! L'ho risolto ora spero, per favore riprova
Zanna,

6
Potrebbe essere leggermente più facile da usare zipinfo: zipinfo -1 foo.zip | wc -loppurezipinfo -t foo.zip | awk '{print $1}'
muru,

@yarone graditissimo! : D
Zanna,

+1 Utilizzato uno dei seguenti: awk, sed, grep;)
Nonny Moose

9

Un'opzione in ritardo di Python, usando python's zipfile, (come suggerito da @muru, grazie!)

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

Come usare

  1. Copia lo script in un file vuoto, salvalo come get_zips.py
  2. Eseguilo con la directory e il numero desiderato (minimo) di file all'interno, ad esempio:

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

Spiegazione

Il copione:

  • elenca i .zipfile all'interno di una directory:

    for zp in [os.path.join(dr, f) for f in os.listdir(dr) if f.endswith(".zip")]:
  • Guarda all'interno del file e conta il numero di file:

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

    Stampa il file (+ percorso) solo se il numero di elementi elencati è inferiore n.


1
Pitone? zipfile !
Muru,

@muru grazie ancora, questo fa la differenza :)
Jacob Vlijm,

9

Usando 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

Oppure può essere fatto anche con lo script.

Crea script 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

Salvalo nella cartella home e rendilo eseguibile con chmod +x zip.shed eseguilo dal terminale./zip.sh

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

  • unzip -l $i conterà il numero di file dal rispettivo file zip e dal suo output,

  • awk 'END {print $(NF-1)}' grep che conta solo il numero, se è inferiore a 15, stampa il nome del file.


5

Perl ha anche un pacchetto per la gestione di archivi zip, Archive::Zip. Lo script seguente accetta i file zip come argomenti della riga di comando e fornisce l'output della riga di comando con il nome e il conteggio dei file all'interno dell'archivio.

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

Prova:

$ ./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
for z in *.zip; do if (( $(unzip -Z1 "$z" | wc -l) < 15 )); then echo "$z"; fi;done

una piccola modifica al codice di @ zanna "$ (decomprimere -Z1" $ z "| wc -l)"
user1048382

0

Ottieni il numero totale di file utilizzando zipinfo:

$ for f in *.zip; do \
  a=($(zipinfo -t "$f")); \
  (($a > 15)) && echo $f; done
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.