Belirli sayıda dosyadan daha az sayıda zip dosyası listeleme


10

.zipBir klasörde binlerce dosyam var. Hangi zip dosyalarının içinde 15'ten az dosya olduğunu bulmak istiyorum.

unzip -lZip dosyalarının içeriğini listeleyebileceğimi biliyorum, ancak 15'ten az dosya içeren zip dosyalarının bir çıktısını nasıl oluşturacağımı bilmiyorum.

Yanıtlar:


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

Bu, .zipstdout'ta (terminalde) 15'ten az dosya içeren dosyaları listeler , böylece bir liste dosyası oluşturmak isterseniz, teedışarı veya yeniden yönlendirebilirsiniz. Burada daha okunabilir bir şekilde, sonunda bir liste dosyası oluşturmak ve terminalde yazdırmak

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

notlar

  • for z in *.zipile biten dosyalar üzerinde döngü yapın .zipve her birine bir şey yapın z;$z
  • if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 ))dosyaları açmak, çıktıyı numarayı ayıklamak yapmak (kesinlikle sadece sayı ayıklamak için daha düzenli bir yol var, ama sedbunu kullandım biliyorum - birçok dosya ile daha hızlı olabilir daha basit bir yol için @ muru'nun yorum bakınız ) 15 yaşından küçük olup olmadığını ve
  • echo "$z" sonra dosya adını yazdır
  • | tee small-zip-list ayrıca çıktıyı yeni bir dosyaya ve terminalde yazdır

Teşekkürler @ Zanna yangınları komut dosyası çalıştırmak için çalıştı ve ben her zaman klasördeki tüm .zip dosya adlarını gösterir, ben daha küçük bir şey için sayı formunu 15 azaltarak bile, klasördeki tüm .zip dosyalarını gösterir.
yarone

@yarone çok üzgünüm, bir alanı kaçırdım! Şimdi düzelttim Umarım, lütfen tekrar deneyin
Zanna

6
Kullanımı biraz daha kolay olabilir zipinfo: zipinfo -1 foo.zip | wc -lveyazipinfo -t foo.zip | awk '{print $1}'
muru

@yarone en hoş geldiniz! : D
Zanna

+1 Aşağıdakilerden birini kullandı: awk, sed, grep;)
Nonny Moose

9

python'S kullanarak geç bir python seçeneği, zipfile(muru tarafından önerildiği gibi, teşekkürler!)

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

Nasıl kullanılır

  1. Komut dosyasını boş bir dosyaya kopyalayın, get_zips.py
  2. Dizini ve içinde istenen (minimum) sayıda dosyayla çalıştırın, örneğin:

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

açıklama

Senaryo:

  • .zipbir dizindeki dosyaları listeler :

    for zp in [os.path.join(dr, f) for f in os.listdir(dr) if f.endswith(".zip")]:
  • Dosyanın içine bakar ve dosya sayısını sayar:

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

    Dosyayı (+ yol) yalnızca listelenen öğelerin sayısı daha azsa yazdırır n.


1
Python? zipfile !
muru

@muru tekrar teşekkürler, bu bir fark yaratır :)
Jacob Vlijm

9

Awk kullanma :

for i in ~/path/to/your/folder/*.zip; do if (( $(unzip -l $i | awk 'END {print $(NF-1)}') < 15 )); then echo "$i"; fi; done

Veya senaryo ile de yapılabilir.

Komut dosyası zip.sh oluştur

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

Ana klasöre kaydedin ve chmod +x zip.shterminal ile çalıştırılabilir yapın ve terminalden çalıştırın./zip.sh

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

  • unzip -l $i ilgili zip dosyasından ve çıktısından dosya sayısını sayar,

  • awk 'END {print $(NF-1)}' grep sadece sayı sayılır, 15'den küçükse dosya adını yazdıracaktır.


5

Perl ayrıca zip arşivlerini işlemek için bir pakete sahiptir Archive::Zip. Aşağıdaki komut dosyası zip dosyalarını komut satırı bağımsız değişkenleri olarak alır ve arşiv içindeki dosya adlarını ve sayısını içeren komut satırı çıktısını sağlar.

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

Test sürüşü:

$ ./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

@ zanna kodunda küçük bir değişiklik "$ (unzip -Z1" $ z "| wc -l)"
user1048382

0

Zipinfo kullanarak toplam dosya sayısını alın:

$ for f in *.zip; do \
  a=($(zipinfo -t "$f")); \
  (($a > 15)) && echo $f; done
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.