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 com 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, em seguida, renomeie-o (o que acredito ser atômico) no destino para o nome do arquivo original e, finalmente, exclua o arquivo de origem .
No entanto, escrever e depurar um script parece ser um exagero para essa tarefa. Existe uma maneira ou ferramenta que já faz isso nativamente?
rsync
cópias para nomes de arquivos temporários (por exemplo, consulte extensão de arquivo temporário Rsync e rsync - ele cria um arquivo temporário durante a transferência? ), a menos que você use a--inplace
opção. 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
--remove-source-files
opção que exclui o(s) arquivo(s) de origem após terem sido transferidos com sucesso. Veja arsync
página do manual para mais detalhes.Juntando tudo isso, você poderia usar algo como:
Esta opção é particularmente útil para tarefas como mover arquivos para fora de uma fila de "recebimento" ou semelhante ao diretório onde serão processados.
Como alternativa, se este for um espelho único, talvez apenas use
rsync
sem a--remove-source-files
opção. Você pode excluir os arquivos de origem posteriormente, se desejar/precisar.