Arsip Zip Dengan Jumlah File Terbatas

12

Perintah apa yang dapat saya gunakan untuk membuat zips dengan batas nomor file? Saya memiliki folder (tidak ada subfolder) dari, katakanlah, 5000 file, jadi saya ingin perintah yang dapat membagi angka itu dan membuat 10 ziparsip individu , masing-masing terdiri dari tidak lebih dari 500 file.

Saya juga tidak ingin 10 zipfile yang dihasilkan terhubung satu sama lain, sehingga saya dapat membukanya secara individual dan tidak perlu membuka semua 10 pada saat yang sama.

pengguna8547
sumber

Jawaban:

13

Anda dapat menggunakan GNU parallel untuk melakukan itu karena ia dapat membatasi jumlah elemen untuk suatu pekerjaan serta memberikan nomor pekerjaan (untuk nama arsip zip yang unik):

$ 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

Opsi -N 5membatasi jumlah file hingga 5 per arsip dan disajikan zipsebagai pengganti{}

{#}( Kata demi kata, tidak digantikan oleh Anda selama doa), digantikan oleh nomor pekerjaan, menghasilkan arch1.zip, arch2.zipdll.

The -print0pilihan untuk finddan -0pilihan untuk parallelbersama-sama memastikan bahwa nama file dengan karakter khusus dengan benar ditangani.

Anthon
sumber
Saya mendapat kesalahan ini: i.imgur.com/JoyPrfY.png Dari perintah ini: find *! -nama "* .zip" -type f -print0 | parallel -0 -N 500 zip arch {13} {}
user8547
@ user8547 yang bukan GNU paralel, tetapi paralelnya termasuk dalam moreutils, sebaiknya Anda kompilasi dan instal dari sumber untuk mendapatkan patch keamanan terbaru. ftp.gnu.org/gnu/parallel/parallel-latest.tar.bz2
Anthon
2
@ user8547 tidak, jalankan saja sudo apt-get install parallel.
terdon
2
@ user8547 mengapa arch{13}? Anda benar-benar perlu menggunakan #karakter. Shell apa yang Anda gunakan?
Anthon
2
@ user8547 Tidak, itu cara mengatakan paralel untuk meletakkan nomor pekerjaan di sana, senang itu berhasil.
Anthon
1

Alternatif hanya shell: memproses kumpulan COUNT file melalui "${@:START:COUNT}"(rentang parameter posisi) dan shift COUNTsambil menambah penghitung cuntuk memberi nama arsip:

atur - *
c = 1
while (($ #)); melakukan
  if [$ # -ge COUNT ]; kemudian
    zip $ {c} .zip "$ {@: 1: COUNT }"
    c = $ ((c + 1))
    bergeser COUNT
  lain
    zip $ {c} .zip "$ {@}"
    shift $ #
  fi
selesai
don_crissti
sumber
1

Jawaban yang diterima bekerja dengan baik untuk saya. :) TETAPI, jika Anda tidak memiliki akses ke paralel (siapa yang tahu mengapa), inilah alternatif yang telah saya buat sebelumnya:

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

Yang akan membuat myarch1.zip, myarch2.zip, myarch3.zip, dll. Anda mungkin ingin menggunakan trik -0 yang disarankan Anthon, jika Anda memiliki nama file yang aneh.

msb
sumber