ファイル数が制限されたZipアーカイブ


12

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

また、結果として得られる10個のzipファイルを相互に接続したくないので、それらを個別に開くことができ、同時に10個すべてを開く必要はありません。

回答:


13

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.ziparch2.zipなど

-print0オプションfind-0するオプションparallelタンデムでは、必ず特殊文字を含むファイル名が正しく処理されていることを確認します。


このエラーが発生しました:i.imgur.com/JoyPrfY.pngこのコマンドから:find *!-name "* .zip" -type f -print0 | パラレル-0 -N 500ジップアーチ{13} {}
user8547 '09 / 11/14

GNUパラレルではありませんが、moreutilsに含まれている@ user8547は、最新のセキュリティパッチを入手するためにソースからコンパイルしてインストールするのが最適です。ftp.gnu.org/gnu/parallel/parallel-latest.tar.bz2
Anthon

2
@ user8547いいえ、ただ実行しsudo apt-get install parallelます。
terdon

2
@ user8547なぜarch{13}?あなたは本当に#キャラクターを使う必要があります。どのシェルを使用していますか?
Anthon 2014年

2
@ user8547いいえ、ジョブ番号をそこに置くようにパラレルに指示する方法です、うまくいったことをうれしく思います。
Anthon 2014年

1

シェルのみの代替手段:(位置パラメーターの範囲)を介してCOUNTファイルのバッチを処理し、カウンターをインクリメントしてアーカイブに名前を付けます。"${@:START:COUNT}"shift COUNTc

セットする  -  *
c = 1
while(($#)); 行う
  if [$#-ge COUNT ]; その後
    zip $ {c} .zip "$ {@:1:COUNT }"
    c = $((c + 1))COUNT回 
    シフト
  そうしないと
    zip $ {c} .zip "$ {@}"
    シフト$#
  fi
やった

1

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

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

これにより、myarch1.zip、myarch2.zip、myarch3.zipなどが作成されます。奇妙なファイル名がある場合は、Anthonが提案した-0トリックを使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.