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