Eu escrevi este script para fazer isso.
Basicamente forma uma matriz contendo os nomes dos arquivos para cada tar, então inicia tar
em paralelo em todos eles .
Pode não ser a maneira mais eficiente, mas fará o trabalho como você deseja.
Posso esperar que consuma grandes quantidades de memória.
Você precisará ajustar as opções no início do script.
Você também pode querer alterar as opções de tar cvjf
na última linha (como remover a saída detalhada v
para desempenho ou alterar a compactação j
para z
, etc ...).
Script
#!/bin/bash
# User configuratoin
#===================
files=(*.log) # Set the file pattern to be used, e.g. (*.txt) or (*)
num_files_per_tar=5 # Number of files per tar
num_procs=4 # Number of tar processes to start
tar_file_dir='/tmp' # Tar files dir
tar_file_name_prefix='tar' # prefix for tar file names
tar_file_name="$tar_file_dir/$tar_file_name_prefix"
# Main algorithm
#===============
num_tars=$((${#files[@]}/num_files_per_tar)) # the number of tar files to create
tar_files=() # will hold the names of files for each tar
tar_start=0 # gets update where each tar starts
# Loop over the files adding their names to be tared
for i in 'seq 0 $((num_tars-1))'
do
tar_files[$i]="$tar_file_name$i.tar.bz2 ${files[@]:tar_start:num_files_per_tar}"
tar_start=$((tar_start+num_files_per_tar))
done
# Start tar in parallel for each of the strings we just constructed
printf '%s\n' "${tar_files[@]}" | xargs -n$((num_files_per_tar+1)) -P$num_procs tar cjvf
Explicação
Primeiro, todos os nomes de arquivos que correspondem ao padrão selecionado são armazenados na matriz files
. Em seguida, o loop for divide essa matriz e forma cadeias de caracteres das fatias. O número de fatias é igual ao número de tarballs desejados. As sequências resultantes são armazenadas na matriz tar_files
. O loop for também inclui o nome do tarball resultante no início de cada string. Os elementos de tar_files
tomam o seguinte formato (assumindo 5 arquivos / tarball):
tar_files[0]="tar0.tar.bz2 file1 file2 file3 file4 file5"
tar_files[1]="tar1.tar.bz2 file6 file7 file8 file9 file10"
...
A última linha do script, xargs
é usada para iniciar vários tar
processos (até o número máximo especificado), onde cada um processará um elemento da matriz tar_files
em paralelo.
Teste
Lista de arquivos:
$ls
a c e g i k m n p r t
b d f h j l o q s
Tarballs gerados: $ ls / tmp / tar * tar0.tar.bz2 tar1.tar.bz2 tar2.tar.bz2 tar3.tar.bz2