Aproximação do movimento atômico através dos sistemas de arquivos?

15

Eu tenho que mover alguns arquivos de um sistema de arquivos para outro no Ubuntu. No entanto, é muito importante que os arquivos nunca existam como arquivos parciais ou incompletos no destino, pelo menos não sob o nome de arquivo correto.

Até agora, minha única solução é escrever um script que pegue cada arquivo, copie-o para um nome temporário no destino e renomeie-o (que, na minha opinião, deve ser atomico) no destino para o nome do arquivo original e finalmente exclui o arquivo original.

No entanto, escrever e depurar um script parece ser um exagero para essa tarefa. Existe uma maneira ou ferramenta que já faz isso nativamente?

    
por Niels2000 21.12.2017 / 12:18

1 resposta

27

rsync copia para nomes de arquivos temporários (por exemplo, extensão de arquivo temporário do Rsync e rsync - cria um arquivo temporário durante a transferência? ) a menos que você use a opção --inplace . Ele os renomeia somente depois que o arquivo foi transferido com sucesso. rsync também exclui todos os arquivos de destino que foram transferidos apenas parcialmente (por exemplo, devido ao disco cheio ou outro erro).

Há também uma opção --remove-source-files que exclui o (s) arquivo (s) de origem depois que eles foram transferidos com êxito. Veja a página rsync man para mais detalhes.

Juntando tudo isso, você pode usar algo como:

rsync -ax --remove-source-files source/ target/

Esta opção é particularmente útil para tarefas como mover arquivos de uma fila "de entrada" ou semelhante ao diretório onde eles serão processados.

Como alternativa, se esse é um espelho único, talvez use apenas rsync sem a opção --remove-source-files . Você pode excluir os arquivos de origem mais tarde, se quiser / precisar.

    
por 21.12.2017 / 12:56