Użyłem terminala do skopiowania plików z jednego dysku na drugi.
sudo mv -vi /location/to/drive1/ /location/to/drive2/
Jednak nagle przestało, po kilku godzinach i bez błędu, po utworzeniu katalogu.
Moje własne rozwiązanie tego problemu jest często mieszaniem haszowania i porównywania, co jest w większości czasochłonnym bałaganem, ponieważ teraz muszę odzyskać kopię pośrednią, nie bardzo wiedząc, które pliki brakuje (napisane jako bardzo długi jednowarstwowy dla zsh - pamiętaj, że ten skrypt nie działa w bashu jak napisano):
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; ) )
Jest to podatne na błędy, jeśli katalog docelowy nazwy lub katalog_źródłowy są częścią ścieżki i usuwają pliki, jeśli nie zostały przeniesione, ponieważ zostały oznaczone jako duplikaty. Poza tym na końcu nie zawiera katalogu źródłowego.
Czy istnieje najlepsza praktyka odzyskiwania po przerwie w MV?
--delete-during receiver deletes during the transfer
, a także kilka innych przydatnych możliwości: --delete --delete-before --delete-delay --delete-after --delete-excluded
. Więc tak, rsync jest najlepszą alternatywą,
mv
polecenia nie działa? Być może z *
dołączoną do ścieżki źródłowej, jeśli oryginalnym źródłem był katalog.
rsync --delete*
że to będzie katastrofa ! To usunie rzeczy, z dest
których obecnie nie ma src
, więc wszystkie pliki, które zostały pomyślnie przeniesione w poprzedniej próbie, zostaną teraz usunięte! Prawdopodobnie myślałeś, rsync --remove-source-files
że zgadzam się, że byłaby dobrą alternatywą. ( more1 , more2 )
rsync --delete
będzie tylko usunąć inne pliki, które nie są częścią źródła. Z [man rsync] () * usuń niepotrzebne pliki z dest dirs *. Zrozum, co znaczy obce : brak synchronizacji. I tak, rsync również zapewnia sposób, aby usunąć pliki źródłowe po ich poprawnie wysłany.
cmp
zamiast mieszania. Ma zależności i te same problemy, owhile read
których wspomniał Gilles. Jest również powolny i pełny. Ale zwalnia miejsce na dysku wcześniej niż metoda rsync, ponieważ pliki są (ponownie) przenoszone ze źródła podczas działania. Może służyć jako inspiracja dla odważnych.