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
.-0
parallel
답변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 "${@}" 송금$# 필리핀 제도 완벽한