É impossível excluir arquivos parciais porque não existe esse conceito. Assim que o produtor criou o arquivo, o arquivo existe, mas ele começa vazio e é preenchido gradualmente.
Você pode testar se o arquivo está aberto para gravação; isso diria que está incompleto. No entanto, isso não é confiável: se o produtor falha (o processo falha ou o sistema falha), você fica com um arquivo incompleto que parece completo.
O que você deve fazer é definir um protocolo para o produtor marcar o arquivo como completo. A maneira normal de fazer isso (e praticamente da única maneira sensata) é o produtor criar o arquivo em um local temporário e, em seguida, movê-lo (com uma chamada de sistema rename
ou o comando mv
shell) quando está terminado.
Você pode usar uma convenção de nomenclatura:
-
Produtor: escreva para $FILENAME.tmp
e passe para o arquivo final.
generate_data >"dir/$FILENAME.tmp"
mv "dir/$FILENAME.tmp" "dir/$FILENAME"
-
Consumidor: exclua .tmp
arquivos.
rsync -a --exclude='*.tmp' dir remote:
Ou você pode usar um diretório temporário.
-
Produtor: escreva no diretório de teste e vá para o local final.
generate_data >"dir/staging/$FILENAME"
mv "dir/staging/$FILENAME" "dir/"
-
Consumidor: exclua o diretório temporário.
rsync -a --exclude='/staging' dir remote: