Ho usato il terminale per copiare i file da un'unità a un'altra.
sudo mv -vi /location/to/drive1/ /location/to/drive2/
Tuttavia, ciò si interruppe improvvisamente, dopo alcune ore e senza errori, dopo aver creato una directory.
La mia soluzione a questo è spesso un mix di hashing e confronto che è per lo più un disastro che richiede tempo in quanto ora devo recuperare da una copia intermedia senza sapere davvero quali file mancano (scritto come one-liner molto lungo per zsh - nota che questo script non funziona in bash come scritto):
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; ) )
Questo è soggetto a errori se la directory di destinazione del nome o la directory source_directory fanno parte del percorso ed eliminano i file se non sono stati spostati perché sono stati contrassegnati come duplicati. Inoltre, non alla fine directory di origine.
Esiste una best practice su come recuperare da mv interrotta?
--delete-during receiver deletes during the transfer
e anche diverse altre alternative utili: --delete --delete-before --delete-delay --delete-after --delete-excluded
. Quindi, sì, rsync è la migliore alternativa,
mv
comando non funziona? Forse con l' *
aggiunta al percorso sorgente se l'origine originale era una directory.
rsync --delete*
sarebbe un disastro ! Rimuoverà le cose da dest
cui non sono attualmente presenti src
, quindi tutti i file che sono stati spostati con successo nel tentativo precedente verranno ora eliminati! Probabilmente stavi pensando a rsync --remove-source-files
quale concordo sarebbe una buona alternativa. ( altro1 , altro2 )
rsync --delete
sarà solo rimuovere gli altri file che non fanno parte della fonte. Da [man rsync] () * elimina i file estranei dalle directory dir *. Comprendi cosa significa estraneo : non essere sincronizzato. E sì, rsync fornisce anche un modo per rimuovere i file sorgente dopo che sono stati correttamente trasmessi.
cmp
invece di hashing. Ha dipendenze e gli stessi problemiwhile read
menzionati da Gilles. È anche lento e dettagliato. Ma libera spazio su disco prima del metodo rsync, poiché i file vengono (ri) spostati dall'origine durante l'esecuzione. Può servire come ispirazione per i coraggiosi.