Eu tenho um processo embaraçosamente paralelo que cria uma quantidade enorme de arquivos quase (mas não completamente) idênticos. Existe uma maneira de arquivar os arquivos "on the fly", para que os dados não consumam mais espaço do que o necessário?
O processo em si aceita parâmetros de linha de comando e imprime o nome de cada arquivo criado no stdout. Estou invocando-o com o parallel --gnu
qual cuida da distribuição de entrada (que vem de outro processo) e da coleta de saída:
arg_generating_process | parallel --gnu my_process | magic_otf_compressor
EXEMPLO SIMPLES para a primeira parte do tubo em bash
:
for ((f = 0; $f < 100000; f++)); do touch $f; echo $f; done
Como poderia magic_otf_compressor
ser? Ele deve tratar cada linha de entrada como nome do arquivo, copiar cada arquivo em um .tar
arquivo compactado (o mesmo arquivo para todos os arquivos processados!) E excluí-lo. (Na verdade, deve ser suficiente imprimir o nome de cada arquivo processado, outro | parallel --gnu rm
pode cuidar da exclusão dos arquivos.)
Existe alguma ferramenta desse tipo? Não estou pensando em compactar cada arquivo individualmente, isso desperdiçaria muito espaço. Examinei archivemount
(manterá o sistema de arquivos na memória -> impossível, meus arquivos são muito grandes e muitos) e avfs
(não consegui fazê-lo funcionar em conjunto com o FUSE). O que eu perdi?
Estou a um passo de invadir essa ferramenta, mas alguém deve ter feito isso antes ...
EDIT : Essencialmente, acho que estou procurando um front-end stdin para libtar
(em oposição ao front-end da linha de comando tar
que lê argumentos da linha de comando).