Я использовал терминал для копирования файлов с одного диска на другой.
sudo mv -vi /location/to/drive1/ /location/to/drive2/
Однако это внезапно прекратилось, через несколько часов, и без ошибок, после создания каталога.
Мое собственное решение этой проблемы часто представляет собой смесь хеширования и сравнения, которая в большинстве случаев занимает много времени, поскольку мне приходится восстанавливать промежуточную копию, не зная, какие именно файлы отсутствуют (записано как очень длинный однострочный для zsh - обратите внимание, что этот скрипт не работает в bash как написано):
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; ) )
Это подвержено ошибкам, если имя целевого каталога или source_directory являются частью пути, и удаляйте файлы, если они не были перемещены, поскольку они были помечены как дубликаты. Также это не исходный каталог в конце.
Есть ли лучшая практика, как оправиться от прерванного мв?
источник
cmp
вместо хеширования. У него есть зависимости и те же проблемы,while read
о которых упоминал Жиль. Это также медленно и многословно. Но он освобождает дисковое пространство раньше, чем метод rsync, потому что файлы (ре) перемещаются из источника во время его работы. Это может послужить вдохновением для смелых.--delete-during receiver deletes during the transfer
а также ряд других полезных альтернатив:--delete --delete-before --delete-delay --delete-after --delete-excluded
. Итак, да, rsync - лучшая альтернатива,mv
команды не работает? Возможно с*
добавленным к исходному пути, если исходный источник был каталогом.rsync --delete*
это будет катастрофа ! Он удалит вещи, изdest
которых в данный момент нетsrc
, поэтому все файлы, которые были успешно перемещены в предыдущей попытке, теперь будут удалены! Вы, наверное, думали о том,rsync --remove-source-files
что я согласен, будет хорошей альтернативой. ( more1 , more2 )rsync --delete
будет только удалить другие файлы , которые не являются частью источника. Из [man rsync] () * удалить посторонние файлы из директории dest *. Понять, что значит постороннее : не синхронизироваться. И да, rsync также предоставляет способ удаления исходных файлов после их правильной передачи.Ответы:
Забудьте о попытке заново изобрести rsync и используйте rsync.
Убедитесь, что вы используете косую черту в источнике, иначе он скопирует в
/location/to/drive2/drive1
.Дважды проверьте, что команда выполнена успешно, затем запустите
rm -rf /location/to/drive1/
.Команда выше перезапишет любой существующий ранее файл из
drive2
. Если вы хотите предложить пользователю пропустить уже существующие файлыdrive2
, как, например, сmv -i
, это более сложно, потому что теперь вам нужно различать файлы, которые уже были скопированы и файлы, которые не были. Вы можете передать--ignore-existing
опцию rsync, чтобы пропустить файлы, которые уже существуют в месте назначения, независимо от их содержимого. Обратите внимание, что если оригиналmv
был прерван во время создания файла, этот файл останется в его полускопированном состоянии (тогда как голыйrsync -a
закончит копирование).Если вы хотите воспроизвести точное поведение
mv -i
, включая подсказку, это можно сделать, но это намного сложнее.Обратите внимание, что ваш гигантский лайнер очень хрупкий. Если есть имена файлов, содержащие обратную косую черту или символы новой строки, они могут быть неправильно скопированы или даже могут заставить ваш скрипт удалить произвольные файлы. Поэтому не используйте код в вопросе, если только вы не уверены, что можете доверять именам файлов, которые не содержат обратной косой черты или новых строк.
Для дальнейшего использования я рекомендую никогда не использовать
mv
большие перемещения между приводами именно потому, что трудно контролировать, что произойдет, если оно прервется. Используйте rsync для копирования, а затем удалите оригинал.источник
rsync
делает то, что вы пытаетесь сделать, а покаmv
нет. Также: копирование между разными машинами; сжатие для передачи; пропуск файлов, существующих в месте назначения, на основе равенства на основе временной метки или хеша; настраиваемая обработка владения, разрешений, ссылок и специальных файлов; и т.д. linux.die.net/man/1/rsyncmv
(или файловый менеджер), потому что он перемещает только ссылку на файл / каталог. Если мне нужно выполнить фактическую передачу данных, то я использую,rsync
если выполняется одно из следующих условий: 1) я перемещаю больше файлов, чем я могу сразу проверить на правильность передачи; 2) Я ожидаю, что мне нужно будет синхронизировать файлы; 3) Я ожидаю, что передача может быть прервана. Я хочу сказать, что для случая использования, который вы представляете в вопросе,rsync
это просто правильный инструмент,mv
илиcp
нет.