특정 파일 수보다 적은 zip 파일 나열


10

.zip하나의 폴더에 수천 개의 파일 이 있습니다. 파일이 15 개 미만인 zip 파일을 찾고 싶습니다.

나는 알고 unzip -l압축 파일의 내용을 나열 할 수 있지만 15 개 미만의 파일이 zip 파일의 출력을 생성하는 방법을 모르겠어요.

답변:


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 개 미만 의 파일 이있는 파일을 stdout (터미널에서)으로 나열하므로 목록 파일을 작성하려는 경우 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에게 감사합니다 .fires 스크립트를 실행하려고 시도했으며 항상 15라는 숫자 형식을 더 작게 줄이면 폴더의 모든 .zip 파일이 표시됩니다.
yarone

@ yarone 너무 죄송합니다, 나는 공간을 놓쳤다! 나는 그것을 고쳤다. 나는 희망한다, 다시 시도해주세요
Zanna

6
약간 더 사용하기 쉬울 수 있습니다 zipinfo: zipinfo -1 foo.zip | wc -l또는zipinfo -t foo.zip | awk '{print $1}'
muru

@yarone 가장 환영합니다! : D
잔나

+1 다음 중 하나를 사용했습니다 : awk, sed, grep;)
Nonny Moose

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
파이썬? zipfile !
muru

차이를 :)하게 @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 각 zip 파일 및 출력에서 ​​파일 수를 계산합니다.

  • awk 'END {print $(NF-1)}' 그 수를 grep하면 15보다 작 으면 파일 이름이 인쇄됩니다.


5

Perl에는 zip 아카이브 처리를위한 패키지도 있습니다 Archive::Zip. 아래 스크립트는 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.