উত্তর:
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
টার্মিনালের পাশাপাশি একটি নতুন ফাইলের আউটপুটও প্রিন্ট করে zipinfo
: zipinfo -1 foo.zip | wc -l
বাzipinfo -t foo.zip | awk '{print $1}'
একজন প্রয়াত পাইথন বিকল্প ব্যবহার 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)
get_zips.py
এটি ডিরেক্টরি এবং ভিতরে প্রয়োজনীয় ফাইলগুলির ন্যূনতম (সর্বনিম্ন) সংখ্যা দিয়ে চালান, উদাহরণস্বরূপ:
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
।
কর্কশ ব্যবহার :
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 এর কম হয় তবে এটি ফাইলের নাম মুদ্রণ করবে।
পার্লের কাছে জিপ সংরক্ষণাগারগুলি পরিচালনা করার জন্য একটি প্যাকেজ রয়েছে 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
for z in *.zip; do if (( $(unzip -Z1 "$z" | wc -l) < 15 )); then echo "$z"; fi;done