Archivo Zip con un número limitado de archivos


12

¿Qué comando puedo usar para crear correos zipelectrónicos con un límite de número de archivo? Tengo una carpeta (sin subcarpetas) de, digamos, 5000 archivos, por lo que desearía un comando que pudiera dividir ese número y crear 10 ziparchivos individuales , cada uno de los cuales consta de no más de 500 archivos.

Tampoco quiero que los 10 ziparchivos resultantes se conecten entre sí, de modo que pueda abrirlos individualmente y no necesite abrir los 10 al mismo tiempo.

Respuestas:


13

Puede usar GNU en paralelo para hacerlo, ya que puede limitar el número de elementos a un trabajo, así como proporcionar un número de trabajo (para un nombre de archivo zip único):

$ 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

La opción -N 5limita el número de archivos a 5 por archivo y se presenta zipen lugar de{}

El {#}(literalmente, no debe ser reemplazado por usted durante la invocación), se reemplaza por el número de trabajo, lo que da como resultado arch1.zip, arch2.zipetc.

La -print0opción de findy -0opción de parallella par asegurarse de que los nombres de archivo con caracteres especiales se manejan correctamente.


Recibí este error: i.imgur.com/JoyPrfY.png De este comando: find *! -name "* .zip" -tipo f -print0 | paralelo -0 -N 500 zip arch {13} {}
usuario8547

@ user8547 que no es paralelo a GNU, pero el paralelo incluido en moreutils, mejor compila e instala desde la fuente para obtener los últimos parches de seguridad. ftp.gnu.org/gnu/parallel/parallel-latest.tar.bz2
Anthon el

2
@ user8547 no, solo corre sudo apt-get install parallel.
terdon

2
@ user8547 ¿por qué arch{13}? Realmente necesitas usar el #personaje. ¿Qué caparazón estás usando?
Anthon

2
@ user8547 No, esa es la forma de decirle al paralelo que ponga el número de trabajo allí, me alegro de que funcionó.
Anthon

1

Una alternativa solo para shell: procese lotes de COUNT archivos a través de "${@:START:COUNT}"(rango de parámetros posicionales) y shift COUNTmientras incrementa un contador cpara nombrar los archivos:

conjunto - *
c = 1
while (($ #)); hacer
  si [$ # -ge COUNT ]; entonces
    zip $ {c} .zip "$ {@: 1: COUNT }"
    c = $ ((c + 1))
    turno COUNT
  más
    zip $ {c} .zip "$ {@}"
    shift $ #
  fi
hecho

1

La respuesta aceptada funcionó perfectamente bien para mí. :) PERO, en caso de que no tenga acceso a paralelo (quién sabe por qué), aquí hay una alternativa que se me ocurrió antes:

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

Lo que creará myarch1.zip, myarch2.zip, myarch3.zip, etc. Es posible que desee utilizar el truco -0 sugerido por Anthon, si tiene nombres de archivo extraños.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.