Estoy en Ubuntu 16.04.
Tengo una carpeta con muchos archivos de texto (casi 12k). Necesito cargarlos todos en un sitio web que acepte .tar.gz
cargas y luego los descomprima automáticamente, pero tiene un límite de 10 MB (10000 KB) por archivo (por lo que, en particular, cada archivo debe descomprimirse por sí solo). Si uso tar.gz
todos estos archivos, el archivo resultante es de aproximadamente 72 MB.
Lo que me gustaría hacer es crear ocho .tar.gz
archivos, cada uno de tamaño / dimensión (estrictamente) más pequeño que 10000 KB.
Alternativamente, se puede suponer que todos los archivos anteriores tienen aproximadamente la misma dimensión, por lo que me gustaría crear ocho .tar.gz
archivos con más o menos la misma cantidad de archivos cada uno.
¿Cómo puedo hacer alguna de estas dos tareas?
Estoy perfectamente bien con una solución que involucra GUI, CLI o secuencias de comandos. No estoy buscando velocidad aquí, solo necesito que se haga.
fuente
tar
agregar todos los archivos que comienzan con un cierto patrón hasta que los tenga todos. Esto se puede programar fácilmente, pero no garantiza que el tamaño sea inferior a 9 MB según lo necesite. Sin embargo, puede ajustar manualmente el tamaño de los archivos que son demasiado grandes dividiéndolos aún más.Respuestas:
Totalmente patchwork y un boceto rápido y aproximado, pero probado en un directorio con 3000 archivos, el siguiente script hizo un trabajo extremadamente rápido:
Cómo utilizar
compress_split.py
Ejecútelo con el directorio con sus archivos como argumento:
los
.tar.gz
archivos numerados se crearán en el mismo directorio donde están los archivos.Explicación
La secuencia de comandos:
EDITAR
Crear automáticamente trozos por tamaño en mb
Más sofisticado es usar el tamaño máximo (en mb) de los fragmentos como (segundo) argumento. En el siguiente script, los fragmentos se escriben en un archivo comprimido tan pronto como el fragmento alcanza (pasa) el umbral.
Dado que la secuencia de comandos se desencadena por los fragmentos, que exceden el umbral, esto solo funcionará si el tamaño de (todos) los archivos es sustancialmente menor que el tamaño del fragmento.
La secuencia de comandos:
Correr:
... donde chunksize es el tamaño de entrada para el comando tar.
En este, se incluyen las mejoras sugeridas por @DavidFoerster. Gracias un montón !
fuente
tar
aún más la invocación proporcionando la lista de archivos en la secuencia de entrada estándar.tar
que le permite especificar archivos para agregar (o extraer) en la entrada estándar con una opción adecuada.Un enfoque de concha pura:
Explicación
files=(*)
: guarde la lista de archivos (también directorios si hay alguno, cambie afiles=(*.txt)
para obtener solo cosas con unatxt
extensión) en la matriz$files
.num=$((${#files[@]}/8));
:${#files[@]}
es el número de elementos en la matriz$files
. Esta$(( ))
es la forma (limitada) de bash de hacer aritmética. Entonces, este comando establece$num
el número de archivos dividido por 8.k=1
: solo un contador para nombrar los tarballs.for ((i=0; i<${#files[@]}; i+=$num)); do
: iterar sobre los valores de la matriz.$i
se inicializa en0
(el primer elemento de la matriz) y se incrementa en$num
. Esto continúa hasta que hayamos pasado por todos los elementos (archivos).tar cvzf files$i.tgz -- ${files[@]:$i:$num}
: en bash, puede obtener un segmento de matriz (parte de una matriz) utilizando${array[@]:start:length}
, por lo${array[@]:2:3}
que devolverá tres elementos a partir del segundo. Aquí, estamos tomando un segmento que comienza en el valor actual de$i
y es$num
elementos largos. Se--
necesita en caso de que alguno de sus nombres de archivo pueda comenzar con a-
.((k++))
: incremento$k
fuente