답변:
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직렬에서 확실히 특수 문자와 파일 이름이 제대로 처리되도록합니다.
sudo apt-get install parallel.
arch{13}? 당신은 정말로 #캐릭터 를 사용해야합니다 . 어떤 쉘을 사용하고 있습니까?
쉘 전용 대안 : (위치 매개 변수 범위)를 통해 COUNT 파일의 배치를 처리 하고 아카이브 이름을 지정하기 위해 카운터 를 증가시키는 동안 :"${@:START:COUNT}"shift COUNTc
세트-*
c = 1
while (($ #)); 하다
[$ # -ge COUNT ] 인 경우; 그때
zip $ {c} .zip "$ {@ : 1 : COUNT }"
c = $ ((c + 1))COUNT 번
교대
그밖에
zip $ {c} .zip "$ {@}"
교대 $ #
fi
끝난