web-dev-qa-db-ja.com

ファイル数が限られているZipアーカイブ

ファイル番号制限付きのZipsを作成するには、どのコマンドを使用できますか?たとえば、5000ファイルのフォルダー(サブフォルダーなし)があるので、その数を分割して、それぞれ500ファイル以下で構成される10個の個別のZipアーカイブを作成できるコマンドが必要です。

また、結果の10個のZipファイルを相互に接続して、それらを個別に開くことができ、10個すべてを同時に開く必要がないようにします。

12
user8547

GNU parallel を使用すると、要素の数をジョブに制限したり、ジョブ番号(一意の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.ZipArch2.Zipなどになります。

find-print0オプションとparallel-0オプションを組み合わせて使用​​すると、特殊文字を含むファイル名が正しく処理されるようになります。

13
Anthon

シェルのみの代替:カウンターをインクリメントしながら"${@:START:COUNT}"(位置パラメーターの範囲)およびshift COUNTを介して[〜#〜] count [〜#〜]ファイルのバッチを処理しますアーカイブに名前を付けるにはc

セット-* 
 c = 1 
 while(($#)); do 
 if [$#-ge カウント ];次に
 $ {c} .Zip "$ {@:1:カウント} "
 c = $((c + 1))
シフト カウント
 else 
 Zip $ {c} .Zip "$ {@}" 
 shift $#
 fi 
 done 
1
don_crissti

受け入れられた答えは私にとって完全にうまくいきました。 :)しかし、もしあなたが(理由を知っている)並列にアクセスできない場合のために、これは私が以前に思いついた代替案です:

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

これにより、myarch1.Zip、myarch2.Zip、myarch3.Zipなどが作成されます。変なファイル名がある場合は、Anthonが提案した-0トリックを使用することをお勧めします。

1
msb