জিপ ফাইলগুলি তালিকাবদ্ধ করুন যা নির্দিষ্ট সংখ্যক ফাইলের চেয়ে কম রয়েছে


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

এটি .zipস্টেডআউটে (টার্মিনালে) 15 টিরও কম ফাইলের সাথে ফাইলগুলি তালিকাবদ্ধ করে , তাই আপনি যদি একটি তালিকা ফাইল তৈরি করতে চান তবে আপনি 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যে আমি এটি ব্যবহার করেছি - একটি সহজ উপায়ের জন্য @ মুড়ুর মন্তব্য দেখুন যা অনেকগুলি ফাইলের সাথে দ্রুততর হতে পারে) এবং পরীক্ষা করুন এটি 15 এরও কম, এবং যদি তা হয়
  • echo "$z" তারপরে ফাইলের নাম মুদ্রণ করুন
  • | tee small-zip-list টার্মিনালের পাশাপাশি একটি নতুন ফাইলের আউটপুটও প্রিন্ট করে

আপনাকে ধন্যবাদ জাননা আমি ফায়ার স্ক্রিপ্টটি চালানোর চেষ্টা করেছি এবং এটি সর্বদা ফোল্ডারের সমস্ত .zip ফাইলের নামগুলি দেখায়, এমনকি যদি আমি সংখ্যাটি 15 ফর্মটি কিছুটা কমিয়ে দিচ্ছি তবে এটি ফোল্ডারে থাকা সমস্ত .zip ফাইলগুলি দেখায়।
ইয়ারোন

@ ইয়ারোন তাই দুঃখিত, আমি একটি জায়গা মিস করেছি! আমি এখনই এটি স্থির করেছি আশা করি, দয়া করে আবার চেষ্টা করুন
Zanna

6
ব্যবহার করতে সামান্য সহজ হতে পারে zipinfo: zipinfo -1 foo.zip | wc -lবাzipinfo -t foo.zip | awk '{print $1}'
muru

@ ইয়ারোন আপনাকে সবচেয়ে স্বাগতম! : ডি
জান্না

+1 নিম্নলিখিতগুলির মধ্যে একটি ব্যবহার করা হয়েছে: awk, সেড, গ্রেপ;)
ননি

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


1
পাইথন? জিপফাইলে !
মুরু

@ মুরু আবার ধন্যবাদ, যে একটি পার্থক্য :)
জ্যাকব Vlijm

9

কর্কশ ব্যবহার :

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)}' গ্রেপ করুন যে কেবল সংখ্যাটি গণনা করুন, যদি এটি 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 এর কোড "$ (আনজিপ -Z1" "wc-l $ z- র)" পরিবর্তন
user1048382

0

জিপিনফো ব্যবহার করে মোট ফাইলের সংখ্যা পান:

$ for f in *.zip; do \
  a=($(zipinfo -t "$f")); \
  (($a > 15)) && echo $f; done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.