Existe uma maneira de redirecionar um arquivo que está escrito

3

Eu tenho um aplicativo que não posso alterar, que grava em um grande arquivo de texto simples de 250 GB. Após a compactação com GZ, são apenas 30 GB.

Esta aplicação não tem opção de comprimir sua saída, e só pode gravar em um nome de arquivo (não para stdout).

Existe uma maneira que eu possa configurar para que a saída seja compactada imediatamente, sem primeiro armazenar o arquivo de 250 GB no meu disco?

Eu também preciso do contrário, para enganar o aplicativo para que ele leia um arquivo de texto simples que, na realidade, é compactado.

    
por Peter Smit 06.11.2010 / 11:27

4 respostas

6

Você pode ter sucesso usando /dev/stdout como o nome do arquivo e canalizando a saída do seu aplicativo para gzip .

/dev/stdout é um link simbólico para /proc/self/fd/1 .

Da mesma forma, você pode usar /dev/stdin como nome de arquivo e canalizar a saída de gzip para o aplicativo.

Eu digo may , porque o aplicativo pode estar esperando um arquivo pesquisável que ele grava (lê de), mas /dev/std{in,out} não será procurado. Se este for o caso, provavelmente você está perdido. Você precisará usar um arquivo pesquisável como o destino para o aplicativo.

    
por 06.11.2010 / 12:15
2
  • O uso pode usar mkfifo para configurar um canal nomeado no qual o programa gravará, enquanto gzip desse canal no destino final.

  • Se você pode passar o nome do arquivo de saída para o programa na linha de comando, este truque (provavelmente bash-specific) também deve funcionar: program >(gzip - >output.gz) , pois isso será traduzido pelo shell em algo como gzip - </dev/fd/63 >output.gz &; program /dev/fd/63 .

por 06.11.2010 / 11:39
2

Originalmente, pensei, é fácil: basta montar um dispositivo de loopback com um sistema de arquivos compactado onde o programa espera gravar. Infelizmente, ao pesquisar, descobri que não há muitos sistemas de arquivos de leitura / gravação e o que está lá (jffs2) não pode ser montado por meio de um dispositivo de loopback.

Eu encontrei FuseCompress , que pode ser o que você está procurando, mas se você precisar de alta confiabilidade, eu 'pular isso.

Outra alternativa seria armazenar o arquivo em um disco rígido USB e fazer um link simbólico no local onde o programa grava. Isso pode ser muito trabalhoso se você costuma trabalhar com o programa ou se ainda não tem uma unidade USB de 250 GB + por aí.

    
por 06.11.2010 / 13:42
2

Se o aplicativo não exigir que sua entrada e saída sejam procuradas, passe-o para /dev/stdout ou <(gunzip <data.gz) - consulte resposta de camh e alex's answer .

Se o aplicativo exigir um arquivo pesquisável, sua melhor opção é um sistema de arquivos que implemente a compactação. Existem algumas implementações do sistema de arquivos unix que suportam compressão:

por 07.11.2010 / 17:16