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 correto.
Até agora, minha única solução é escrever um script que pegue cada arquivo, copie-o para um nome temporário no destino, renomeie-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 esta tarefa. Existe uma maneira ou ferramenta que já faz isso nativamente?
Respostas:
rsync
copia 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 depois que eles foram transferidos com sucesso. Veja arsync
página de manual para mais detalhes.Juntando tudo isso, você pode usar algo como:
Essa opção é particularmente útil para tarefas como mover arquivos de uma fila "de entrada" ou semelhante ao diretório em que serão processados.
Como alternativa, se este for um espelho único, talvez use apenas
rsync
sem a--remove-source-files
opção. Você pode excluir os arquivos de origem posteriormente, se desejar / precisar.fonte
rsync
poderia fazer, e eu sabia que ela transferia arquivos com um nome temporário (a menos que você use--inplace
), então procurei emman rsync
e encontrou--remove-source-files
.rsync
é uma boa ferramenta para verificar primeiro quase todas as tarefas de transferência de arquivos.