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

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

zip파일 수에 제한이 있는 파일을 만들려면 어떤 명령을 사용할 수 있나요 ? 5000개의 파일이 있는 폴더(하위 폴더 없음)가 있으므로 해당 숫자를 분할하고 zip각각 500개 이하의 파일을 포함하는 10개의 별도 아카이브를 생성하는 명령이 필요합니다.

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

답변1

당신은 그것을 사용할 수 있습니다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.-0parallel

답변2

허용되는 답변은 나에게 잘 작동합니다. :) 그러나 병렬 처리에 액세스할 수 없는 경우(이유는 알 수 없음) 이전에 제안한 대안은 다음과 같습니다.

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

이렇게 하면 myarch1.zip, myarch2.zip, myarch3.zip 등이 생성됩니다. 파일 이름이 이상한 경우 Anthon이 제안한 -0 트릭을 사용할 수 있습니다.

답변3

셸 전용 대안: 일괄 처리계산"${@:START:COUNT}"(위치 매개변수 범위) 로 아카이브의 이름을 지정하고 shift COUNT동시에 카운터를 증가시킵니다 c.

놓다- *
c=1
그리고 (($#));
  만약 [ $# -ge계산];그 다음에
    zip ${c}.zip "${@:1:계산}"
    c=$((c+1))
    옮기다계산
  기타
    zip ${c}.zip "${@}"
    송금$#
  필리핀 제도
완벽한

관련 정보