ファイル番号制限付きのZip
sを作成するには、どのコマンドを使用できますか?たとえば、5000ファイルのフォルダー(サブフォルダーなし)があるので、その数を分割して、それぞれ500ファイル以下で構成される10個の個別のZip
アーカイブを作成できるコマンドが必要です。
また、結果の10個のZip
ファイルを相互に接続して、それらを個別に開くことができ、10個すべてを同時に開く必要がないようにします。
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.Zip
、Arch2.Zip
などになります。
find
の-print0
オプションとparallel
の-0
オプションを組み合わせて使用すると、特殊文字を含むファイル名が正しく処理されるようになります。
シェルのみの代替:カウンターをインクリメントしながら"${@: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
受け入れられた答えは私にとって完全にうまくいきました。 :)しかし、もしあなたが(理由を知っている)並列にアクセスできない場合のために、これは私が以前に思いついた代替案です:
find . ! -name '*.Zip' -type f | xargs -n 500 | awk '{system("Zip myarch"NR".Zip "$0)}'
これにより、myarch1.Zip、myarch2.Zip、myarch3.Zipなどが作成されます。変なファイル名がある場合は、Anthonが提案した-0トリックを使用することをお勧めします。