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
}
}