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, durante algumas horas e sem erros, após a criação de um diretório.
Minha própria solução para isso é muitas vezes uma mistura de hash e comparação, o que consome muito tempo, pois agora tenho que me recuperar de uma cópia intermediária sem saber realmente quais arquivos estão faltando (escrito como uma linha muito longa para zsh - observe que este script não funciona no bash como está 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 diretório de destino do nome ou o diretório source_ fizer parte do caminho e excluir os arquivos se eles não foram movidos porque foram marcados como duplicados. Também não origina o diretório no final.
Existe uma prática recomendada como se recuperar de um MV interrompido?
--delete-during receiver deletes during the transfer
e também várias outras alternativas úteis: --delete --delete-before --delete-delay --delete-after --delete-excluded
. Então, sim, rsync é a melhor alternativa,
mv
comando não funciona? Talvez com *
anexado ao caminho de origem, se a fonte original fosse um diretório.
rsync --delete*
que seria um desastre ! Ele removerá itens dos dest
quais não estão atualmente src
, portanto todos os arquivos que foram movidos com sucesso na tentativa anterior agora serão excluídos! Você provavelmente estava pensando no rsync --remove-source-files
que eu concordo seria uma boa alternativa. ( more1 , more2 )
rsync --delete
será única remover outros arquivos que não fazem parte da fonte. De [man rsync] () * exclua arquivos estranhos dos diretórios de destino *. Entenda o que significa estranho : Não está sendo sincronizado. E sim, o rsync também fornece uma maneira de remover arquivos de origem depois que eles foram transmitidos corretamente.
cmp
vez de hash. Tem dependências e os mesmos problemaswhile read
mencionados por Gilles. Também é lento e detalhado. Porém, libera espaço em disco antes do método rsync, porque os arquivos são (re) movidos da fonte enquanto são executados. Pode servir de inspiração para os corajosos.