ज़िप फ़ाइलों को सूचीबद्ध करें, जिनमें विशिष्ट फ़ाइलों की संख्या कम है


10

मेरे पास .zipएक फ़ोल्डर में हजारों फाइलें हैं। मैं यह जानना चाहता हूं कि कौन सी ज़िप फाइलों में 15 से कम फाइलें हैं।

मुझे पता है कि unzip -lज़िप फ़ाइलों की सामग्री को सूचीबद्ध किया जा सकता है, लेकिन मुझे नहीं पता कि ज़िप फ़ाइलों का आउटपुट कैसे बनाया जाए जिसमें 15 से कम फाइलें हों।

जवाबों:


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 से कम फ़ाइलों के साथ स्टैडआउट (टर्मिनल में) को सूचीबद्ध करता है , इसलिए यदि आप एक सूची फ़ाइल बनाना चाहते हैं, तो आप 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 ))अनज़िप करें फाइलों को गिनें, आउटपुट से नंबर निकालें (निश्चित रूप से केवल नंबर निकालने के लिए एक कठिन तरीका है, लेकिन मुझे पता है कि sedमैंने इसका उपयोग किया है - सरल तरीके से @ muru की टिप्पणी देखें जो कई फ़ाइलों के साथ तेज़ हो सकती है) और परीक्षण करें कि क्या यह 15 से कम है, और यदि यह है
  • echo "$z" फिर फ़ाइल नाम मुद्रित करें
  • | tee small-zip-list आउटपुट को एक नई फ़ाइल पर प्रिंट करें, साथ ही साथ टर्मिनल में भी

धन्यवाद @Zanna मैंने आग की पटकथा को चलाने की कोशिश की और यह हमेशा फ़ोल्डर में सभी .zip फ़ाइलनाम को दिखाता है, भले ही मैं संख्या फ़ॉर्म 15 को कुछ छोटा कर रहा हूं, यह फ़ोल्डर में सभी .zip फ़ाइलों को दिखाता है।
यार्न

@ बहुत खेद है, मुझे एक जगह याद आ गई! मैंने इसे अब ठीक कर दिया है मुझे उम्मीद है, कृपया फिर से कोशिश करें
ज़न्ना

6
उपयोग करने के लिए थोड़ा आसान हो सकता है zipinfo: zipinfo -1 foo.zip | wc -lयाzipinfo -t foo.zip | awk '{print $1}'
mरू

@ अय्यर का सबसे ज्यादा स्वागत है! : डी
ज़न्ना

+1 ने निम्न में से एक का उपयोग किया: awk, sed, grep;)
नॉन मोसे

9

एक देर से अजगर विकल्प का उपयोग कर 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



@ muru फिर से धन्यवाद, इससे फर्क पड़ता है :)
याकूब 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 यह संबंधित ज़िप फ़ाइल से फ़ाइलों की संख्या और इसके आउटपुट से गणना करेगा,

  • awk 'END {print $(NF-1)}' grep जो केवल संख्या की गिनती करता है, यदि यह 15 से कम है तो यह फ़ाइल नाम प्रिंट करेगा।


5

पर्ल भी ज़िप अभिलेखागार से निपटने के लिए एक पैकेज है, Archive::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
for z in *.zip; do if (( $(unzip -Z1 "$z" | wc -l) < 15 )); then echo "$z"; fi;done

@ zanna के कोड में मामूली बदलाव "$ (unzip -Z1" $ z "| wc -l)"
user1048382

0

Zipinfo का उपयोग करके फ़ाइलों की कुल संख्या प्राप्त करें:

$ for f in *.zip; do \
  a=($(zipinfo -t "$f")); \
  (($a > 15)) && echo $f; done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.