Editar 2:
Eu releio sua pergunta e descobri uma nova maneira de interpretá-la. É simples encontrar o tamanho de um arquivo após a compactação, usando algo como bzip2 -k $file | wc -c
em cada arquivo. Isso, no entanto, não resolverá seu problema, pois você não está interessado no tamanho de cada arquivo compactado, mas no tamanho compactado de um tarball que contém todos os seus arquivos (e quanto ele aumenta se você adicionar um arquivo específico). A diferença de tamanho da compactação não é linear , mas, de fato, bastante imprevisível, de modo que um é um preditor ruim para o segundo.
Um exemplo são dois arquivos idênticos de 10 MiB, em que ambos compactam individualmente para 1 MiB e um tarball contendo ambos também comprime para 1 MiB.
Resposta original
Acredito que a solução comum é apenas dividir os dados compactados com split
, o que significa que você precisa de todos os discos resultantes disponíveis se quiser recuperar um arquivo de qualquer um deles. Eu acho que tar
tem um mecanismo de divisão embutido, mas funciona apenas na quantidade de dados descomprimidos, o que dá resultados ruins com compactação e arquivos não homogêneos.
Uma solução diferente (longe da perfeição) funciona se você pode ter intervenção manual e pode ser suficiente. Funciona melhor se os seus arquivos forem grandes em comparação com o tamanho de volume desejado
Eu sugiro que você tenha um tamanho de volume de destino, em MiB. No exemplo, uso 700 MiB.
Se você correr
tout="/tmp/09b00c50a9625deeb1089b3c4358c5e5" #or something else
csize="7" # in MiB
mkfifo "$tout"
tar -cvj ~/ 2>"$tout" | dd bs=1M count="$csize" of=/dev/null iflag=fullblock 2>/dev/null &
tail -20 "$tout" | xargs -n 1 ls -ld
rm "$tout"
tar
imprimirá todos os arquivos que tentar compactar no pipe, até que dd tenha recebido 700 MiB de dados compactados. tail
lê os últimos 20 arquivos que tar
tentou compactar do fifo.
O último arquivo impresso (pelo menos) não poderá caber no tamanho do seu volume. Devido ao cache em tar
e bzip2
, vários dos outros últimos arquivos podem não se adequar a ambos, portanto, talvez seja necessário experimentar um pouco com quantos deles você pula. Se todos os arquivos forem muito pequenos, você pode ter que dizer a tail
para imprimir mais de 20 deles para ver o que excede o limite.
Editar:
Você pode até gravar os nomes dos arquivos diretamente na sua lista de arquivos (com um filtro adequado para remover diretórios) e apenas excluir as últimas linhas em um editor de texto.