Se você mover um arquivo para um sistema de arquivos diferente, o que acontece sob o capô é que o conteúdo atual do arquivo é copiado e o arquivo original é excluído. Se o programa ainda estava gravando no arquivo, ele continua gravando no arquivo agora excluído. Um arquivo deletado-mas-aberto, na verdade, não é apagado, mas apenas desanexado (não tem mais nome); o arquivo é excluído para real quando o programa o fecha. Então você pega o pior dos dois mundos: o arquivo ainda usa tanto espaço em disco, mas você perde o restante da saída.
Você pode pressionar Ctrl + Z para suspender o processo em primeiro plano e retomá-lo com o comando bg
ou fg
. Todos os tópicos são suspensos, a menos que o programa tenha passado por situações que se comportem de outra forma. (Um programa projetado para gerar filhos pela rede pode se comportar de outra forma. Um programa multithread de processo único tem alta probabilidade de se comportar normalmente.) Se o programa consistir em processos diferentes, use o comando ps
para localizá-los todos e algo como kill -STOP 1234 1238 1239
para suspender todos eles (use kill -CONT …
para continuá-los depois).
Se o programa gravar ou até mesmo ler no arquivo, você não poderá remover seus dados sob o seu nariz. Mover os dados nesse estágio pode ser factível, mas seria difícil e dependente de como o programa funciona. Mas, dada a sua descrição, o programa provavelmente continua anexando a cada arquivo, em cujo caso é possível remover alguns dados no início.
Não edite os arquivos: é improvável que isso seja feito. A maioria dos editores trabalha salvando um novo arquivo e movendo-o no lugar dos antigos (isso é mais robusto em caso de falha ao salvar). Você pode economizar espaço em disco truncando o início do arquivo. Primeiro, copie o arquivo para salvar os dados em outro lugar. Em seguida, trunque o arquivo para comprimento 0. O programa continuará anexando na posição onde estava antes; se essa posição for 12345, então, assim que o programa anexar outro byte, o arquivo será iniciado com 12345 bytes nulos. A maioria desses bytes nulos não ocupará espaço em disco: o arquivo será um arquivo esparso .
# Suspend the program first, otherwise you'll lose output produced between cp and truncation!
for x in *.out; do
cp "$x" /elsewhere/
: >|"$x" # truncate $x to size 0
done
Quando o programa terminar, você poderá anexar os dados restantes aos arquivos salvos em outro lugar. O utilitário tail
pode copiar um arquivo omitindo os primeiros N bytes; note que o argumento é um mais o número de bytes para omitir.
for x in *.out; do
existing_size=$(stat -c %s "/elsewhere/$x")
tail -c +$((existing_size+1)) "$x" >>"/elsewhere/$x"
done
Se você tiver o rsync 3.0.0 ou superior, poderá usar
rsync --append *.out /elsewhere/
Observe que as versões mais antigas do rsync sobrescreveriam a parte existente dos arquivos com os bytes nulos recém-aparecidos da origem! Verifique suas versões do rsync antes de fazer isso.