파일 수가 제한된 Zip 아카이브


12

zip파일 번호 제한이있는 을 만들 때 어떤 명령을 사용할 수 있습니까? 5000 파일의 폴더 (하위 폴더 없음)가 있으므로 그 수를 나누고 zip각각 500 개 이하의 파일로 구성된 10 개의 개별 아카이브를 만들 수있는 명령을 원합니다 .

또한 결과 10 개의 zip파일이 서로 연결되는 것을 원하지 않으므로 개별적으로 열 수 있고 동시에 10 개를 모두 열 필요는 없습니다.

답변:


13

GNU 병렬 을 사용 하면 요소 수를 작업으로 제한하고 작업 번호 (고유 한 zip 아카이브 이름의 경우)를 제공 할 수 있으므로 다음과 같이 할 수 있습니다.

$ touch $(seq 20)
$ find . ! -name "*.zip" -type f -print0 | parallel -0 -N 5 zip arch{#} {}
  adding: 1 (stored 0%)
  adding: 10 (stored 0%)
  adding: 11 (stored 0%)
  adding: 12 (stored 0%)
  adding: 13 (stored 0%)
  adding: 14 (stored 0%)
  adding: 15 (stored 0%)
  adding: 16 (stored 0%)
  adding: 17 (stored 0%)
  adding: 18 (stored 0%)
  adding: 19 (stored 0%)
  adding: 2 (stored 0%)
  adding: 20 (stored 0%)
  adding: 3 (stored 0%)
  adding: 4 (stored 0%)
  adding: 5 (stored 0%)
  adding: 6 (stored 0%)
  adding: 7 (stored 0%)
  adding: 8 (stored 0%)
  adding: 9 (stored 0%)
$ ls
1   11  13  15  17  19  20  4  6  8  arch1.zip  arch3.zip
10  12  14  16  18  2   3   5  7  9  arch2.zip  arch4.zip

이 옵션 -N 5은 아카이브 당 파일 수를 5 개로 제한하고 zip대신에 표시됩니다 .{}

{#}(그대로, 호출하는 동안 당신에 의해 대체되는 것은 아니다), 그 결과, 작업 번호로 대체됩니다 arch1.zip, arch2.zip

-print0에 옵션 find-0에 옵션 parallel직렬에서 확실히 특수 문자와 파일 이름이 제대로 처리되도록합니다.


이 오류가 발생했습니다 : i.imgur.com/JoyPrfY.png 이 명령에서 : * 찾기! -name "* .zip"-type f -print0 | 평행 -0 -N 500 집 아치 {13} {}
user8547

GNU 병렬이 아닌 @ user8547이지만 moreutils에 포함 된 병렬은 소스에서 컴파일하고 설치하여 최신 보안 패치를 얻는 것이 가장 좋습니다. ftp.gnu.org/gnu/parallel/parallel-latest.tar.bz2
Anthon

2
@ user8547 아니오, 그냥 실행하십시오 sudo apt-get install parallel.
terdon

2
왜 @ user8547입니까 arch{13}? 당신은 정말로 #캐릭터 를 사용해야합니다 . 어떤 쉘을 사용하고 있습니까?
Anthon

2
@ user8547 아니요, 작업 번호를 거기에 두어 병렬로 알려주는 방법입니다.
Anthon

1

쉘 전용 대안 : (위치 매개 변수 범위)를 통해 COUNT 파일의 배치를 처리 하고 아카이브 이름을 지정하기 위해 카운터 를 증가시키는 동안 :"${@:START:COUNT}"shift COUNTc

세트-*
c = 1
while (($ #)); 하다
  [$ # -ge COUNT ] 인 경우; 그때
    zip $ {c} .zip "$ {@ : 1 : COUNT }"
    c = $ ((c + 1))COUNT 번 
    교대
  그밖에
    zip $ {c} .zip "$ {@}"
    교대 $ #
  fi
끝난

1

받아 들인 대답은 나에게 완벽하게 잘 작동했습니다. :) 그러나 병렬 (이유를 아는 사람)에 액세스 할 수없는 경우 이전에 생각해 낸 대안이 있습니다.

find . ! -name '*.zip' -type f | xargs -n 500 | awk '{system("zip myarch"NR".zip "$0)}'

myarch1.zip, myarch2.zip, myarch3.zip 등이 생성됩니다. 이상한 파일 이름이 있으면 Anthon에서 제안한 -0 트릭을 사용하는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.