Colocando m arquivos em um diretório em arquivos n tar por tamanho?

2

Alguém sabe se é possível criar arquivos n tar (de tamanho praticamente igual) a partir de uma coleção maior de arquivos em um diretório, de forma que eles possam ser extraídos individualmente?

Eu estava olhando para a opção tar --multi-line , mas infelizmente parece que TODOS os arquivos tar resultantes são necessários para extrair os arquivos originais. Ainda mais com tar -ing então split -ing os arquivos.

Se eles não precisassem ser aproximadamente do mesmo tamanho, eu diria que ls | wc para obter o número de arquivos no diretório, então divida os nomes dos arquivos em conjuntos de tamanhos iguais (algo como: ls | tail -n900| head -n100 ) e os passa para tar . Mas você pode acabar com grandes variações de tamanho.

Alguma idéia?

    
por Andrei 02.09.2016 / 23:01

1 resposta

0

Você pode escrever um script que analise os tamanhos dos arquivos e os distribua em lixeiras , tomando cuidado para não exceder o tamanho máximo. A solução ideal pode não ser simples, mas um algoritmo guloso deve ser feito.

Um problema menor seria levar em conta o espaço de escrituração contido por tar além do conteúdo do arquivo. (Além disso, como lidar com diretórios e arquivos especiais?)

Um problema maior aparecerá se você quiser compactar os arquivos. Como o idioma usual é juntar os arquivos com tar e compactar o arquivo tar com um utilitário separado, não é tão simples dividir o arquivo resultante nos limites do arquivo. Você precisaria conhecer os tamanhos compactados dos arquivos antecipadamente. Se você compactar os arquivos antes de tar -los juntos, você sabe os tamanhos, mas perde as vantagens de espaço de compactar todos os arquivos de uma só vez.

Na verdade, criei um script awk simples para fazer isso em algum momento. Código abaixo, use com

find dir/ -printf "%s\t%p\n" | sort -n | awk -vmax=$maxsizeinbytes -f pack.awk

(A saída vai para bins.list.NNN . Sem garantia, não funciona com nomes de arquivos contendo espaço em branco, provavelmente outros bugs também, etc.)

#!/usr/bin/awk
# pack.awk
{ 
    if ($1 > max) {
        printf "too big (%d, max %d): ", $1, max, $2 > "/dev/stderr";
        exit 1;
    }
    for (x in bins) {
        if (free[x] >= $1) { 
            bins[x] = bins[x] "\n" $2; 
            count[x]++; free[x] -= $1; 
            next 
        }
    }; 
    bins[++i] = $2; free[i] = max - $1; count[i] = 1;
} 
END {
    for (i in bins) {
        printf "bin %d: entries: %d size: %d \n", i, count[i], max - free[i]; 
        print bins[i] > "bins.list." i
    }
}
    
por 04.09.2016 / 23:33