У меня есть папка ~ 200 000 файлов с общим размером около 300 ГБ, которые мне нужно передать по SSH-соединению на удаленный хост. Я ищу способ удаления локальных файлов после того, как будет подтверждено, что они успешно скопированы на удаленный хост, но я не могу понять, как это сделать. rsync --remove-source-files
кажется небезопасным, если разрывается соединение согласно другим сообщениям (здесь). Как это можно сделать безопасно?
3 ответа
Есть сценарий оболочки:
Обратите внимание, что он делает некоторые предположения, которые я задокументировал ниже.
#!/bin/sh
# first, upload the directory structure
# be REALLY sure that it made it intact!
while true
do
# try to upload it:
rsync $flags --filter="+ */" --filter="- *" $source $destination
# it uploaded fine? cool, break the loop (else try again):
[ "$?" -eq 0 ] && break
done
# now the files
for file in $(find $source -not -type d)
do
# again, be REALLY sure they copied okay!
while true
do
# try to upload it:
rsync $flags $file $destination/$file
# it uploaded fine? cool, break the innermost loop (else try again):
[ "$?" -eq 0 ] && break
done
# delete the local copy of the file:
rm $file
done
Этот скрипт предполагает следующее:
- Эти
$source
,$destination
и$flags
были либо установлены в качестве переменных среды, либо заменены в скрипте фактическим источником, получателем и любыми другими флагамиrsync
вы хотите использовать. (Не заменить$?
или$file
.) - Этот
$source
является относительным путем. - Этот
rsync
завершит работу с ненулевым состоянием, если по какой-либо причине указанный$file
не был скопирован на 100% успешно. - Что вы проверили это на менее важных данных, потому что я не сделал.
Параметры rsync
--filter
были скопированы из сообщения в блоге неким парнем по имени Фил. Надеюсь, с ним все в порядке. :)
Может быть, вы можете использовать sshfs. sshfs позволяет вам "монтировать" удаленный каталог через ssh (фактически выполняя команды других ssh для имитации файловой системы). Затем вы можете использовать mv
для перемещения ваших файлов.
Вам не нужно быть суперпользователем, поскольку это файловая система пользовательского пространства.
Вы можете разбить файлы на блоки по десять, например, а затем
rsync (source files) destination
И, если он прошел успешно, следуйте за ним с
rsync --remove-source-files (source files) destination
Добавленная пропускная способность второй команды rsync незначительна.