Eu usei o terminal para copiar arquivos de uma unidade para outra.
sudo mv -vi /location/to/drive1/ /location/to/drive2/
No entanto, isso parou de repente, algumas horas depois, e sem erro, depois de criar um diretório.
Minha própria solução para isso geralmente é uma mistura de hash e comparação, o que é principalmente uma bagunça demorada, pois agora tenho que me recuperar de uma cópia intermediária sem realmente saber quais arquivos estão faltando (escrito como uma linha muito longa para zsh - observe que este script não funciona no bash conforme escrito):
source_directory="/path/to/source_directory/";
target_directory="/path/to/target_directory/";
while read hash_and_file; do {
echo "${hash_and_file}" | read hash file;
echo "${file}" | sed "s/^/${source_directory}/g" | read copy_from;
echo "${copy_from}" | sed "s/${source_directory}/${target_directory}/g" | read copy_to;
mv -v "${copy_from}" "${copy_to}" | tee -a log;
rm -v "${copy_from}" | tee -a log; };
done <<<$(
comm -23 <( find ${source_directory} -type f -exec sha256sum "{}" \; |
sed "s: ${source_directory}: :g" | sort;
) <( find ${target_directory} -type f -exec sha256sum "{}" \; |
sed "s: ${target_directory}: :g" | sort; ) )
Isso é propenso a erros se o nome diretório de destino ou diretório_origem fizerem parte do caminho e excluir arquivos se eles não tiverem sido movidos porque foram marcados como duplicados. Além disso, ele não fornece o diretório de origem no final.
Existe uma prática recomendada de como recuperar de mv interrompido?
Esqueça a tentativa de reinventar o rsync e use o rsync.
Certifique-se de usar uma barra final na fonte, caso contrário, ela será copiada para
/location/to/drive2/drive1
.Verifique novamente se o comando foi bem-sucedido e execute
rm -rf /location/to/drive1/
.O comando acima substituirá qualquer arquivo preexistente de
drive2
. Se você quiser solicitar ao usuário que ignore arquivos que já existiam emdrive2
, como emmv -i
, é mais complicado, porque agora você precisa distinguir arquivos que já foram copiados e arquivos que não foram. Você pode passar a--ignore-existing
opção de rsync para ignorar arquivos que já existem no destino, independentemente de seu conteúdo. Observe que se o originalmv
foi interrompido no meio da criação de um arquivo, este arquivo permanecerá em seu estado semi-copiado (enquanto um barersync -a
terminaria de copiá-lo).Se você quiser reproduzir o comportamento exato de
mv -i
, incluindo o prompt, isso pode ser feito, mas é muito mais complicado.Observe que seu forro gigante é muito frágil. Se houver nomes de arquivos contendo barras invertidas ou novas linhas, eles podem não ser copiados corretamente ou podem até enganar seu script para remover arquivos arbitrários. Portanto , não use o código na pergunta a menos que tenha certeza de que pode confiar nos nomes dos arquivos para não conter barras invertidas ou novas linhas.
Para referência futura, recomendo nunca usar
mv
para grandes movimentos de cross-drive, justamente porque é difícil controlar o que acontece se for interrompido. Use rsync para fazer a cópia e remova o original.