Liệt kê các tệp zip có ít hơn một số tệp cụ thể


10

Tôi có hàng ngàn .ziptập tin trong một thư mục. Tôi muốn tìm tệp zip nào có ít hơn 15 tệp trong đó.

Tôi biết rằng unzip -lcó thể liệt kê nội dung của các tệp zip nhưng tôi không biết cách tạo đầu ra của các tệp zip có ít hơn 15 tệp.

Câu trả lời:


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

Điều này liệt kê các .ziptệp có ít hơn 15 tệp vào thiết bị xuất chuẩn (trong thiết bị đầu cuối), vì vậy nếu bạn muốn tạo một tệp danh sách, bạn có thể teethoát ra hoặc chuyển hướng. Ở đây dễ đọc hơn, tạo một tệp danh sách ở cuối cũng như in trong thiết bị đầu cuối

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

Ghi chú

  • for z in *.ziplặp qua các tệp kết thúc bằng .zipvà làm một cái gì đó cho từng tệp , được biểu thị bằng biến được ztham chiếu với$z
  • if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?/\1/p') < 15 ))giải nén số tập tin, trích xuất số từ đầu ra (chắc chắn có một cách gọn gàng hơn để chỉ trích xuất số, nhưng tôi biết sedvì vậy tôi đã sử dụng nó - xem nhận xét của @ muru để biết cách đơn giản hơn có thể nhanh hơn với nhiều tệp) và kiểm tra xem nó có nhỏ hơn 15 không, và nếu nó là
  • echo "$z" sau đó in tên tệp
  • | tee small-zip-list cũng in đầu ra sang một tệp mới, cũng như trong thiết bị đầu cuối

Cảm ơn bạn @Zanna tôi đã cố chạy tập lệnh bắn và nó luôn hiển thị tất cả tên tệp .zip trong thư mục, ngay cả khi tôi đang giảm mẫu số 15 xuống một cái gì đó nhỏ hơn, nó sẽ hiển thị tất cả các tệp .zip trong thư mục.
yarone

@yarone rất xin lỗi, tôi đã bỏ lỡ một khoảng trống! Tôi đã sửa nó ngay bây giờ Tôi hy vọng, vui lòng thử lại
Zanna

6
Có thể dễ sử dụng hơn một chút zipinfo: zipinfo -1 foo.zip | wc -lhoặczipinfo -t foo.zip | awk '{print $1}'
muru

@yarone hoan nghênh nhất! : D
Zanna

+1 Đã sử dụng một trong các cách sau: awk, sed, grep;)
Nonny Moose

9

Tùy chọn python muộn, sử dụng python's zipfile, (như được đề xuất bởi @muru, cảm ơn!)

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

Cách sử dụng

  1. Sao chép tập lệnh vào một tập tin trống, lưu nó dưới dạng get_zips.py
  2. Chạy nó với thư mục và số lượng tệp (tối thiểu) mong muốn bên trong, ví dụ:

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

Giải trình

Kịch bản:

  • liệt kê .zipcác tập tin trong một thư mục:

    for zp in [os.path.join(dr, f) for f in os.listdir(dr) if f.endswith(".zip")]:
  • Nhìn vào bên trong tệp và đếm số lượng tệp:

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

    Chỉ in tệp (đường dẫn +) nếu số lượng mục được liệt kê nhỏ hơn n.


1
Con trăn? khóa kéo !
muru

@muru cảm ơn một lần nữa, điều đó tạo nên sự khác biệt :)
Jacob Vlijm

9

Sử dụng 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

Hoặc nó cũng có thể được thực hiện với kịch bản.

Tạo tập lệnh 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

Lưu nó trong thư mục nhà và làm cho nó thực thi được chmod +x zip.shvà chạy từ thiết bị đầu cuối./zip.sh

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

  • unzip -l $i nó sẽ đếm số lượng tệp từ tệp zip tương ứng & từ đầu ra của nó,

  • awk 'END {print $(NF-1)}' grep chỉ đếm số, nếu nó nhỏ hơn 15 thì nó sẽ in tên tệp.


5

Perl cũng có một gói để xử lý tài liệu lưu trữ zip , Archive::Zip. Kịch bản bên dưới lấy các tệp zip làm đối số dòng lệnh và cung cấp đầu ra dòng lệnh với tên và số lượng tệp trong kho lưu trữ.

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

Chạy thử nghiệm:

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

một thay đổi nhỏ đối với mã của @ zanna "$ (giải nén -Z1" $ z "| wc -l)"
user1048382

0

Nhận tổng số tệp bằng zipinfo:

$ for f in *.zip; do \
  a=($(zipinfo -t "$f")); \
  (($a > 15)) && echo $f; done
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.