ファイル数が制限された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 "${@}"
    送金$#
  フィリピン諸島
完璧

関連情報