5

Вот вещь,

На моем сервере есть папка размером 50 ГБ, в которой содержится более 60000 файлов. Я использовал rsync для передачи на зеркальный сервер, и почти половина файла была передана.Теперь я хочу удалить перенесенный файл на главном сервере.

Можно ли это сделать с помощью rsync? Я прочитал справку и нашел параметр --delete, но эти файлы очень важны, поэтому я хочу получить экспертное заключение, спасибо.

2 ответа2

4

rsync (проверено с версией 3.0.9) имеет опцию --remove-source-files которая делает то, что говорит. Если вы хотите удалить только переданные файлы и не передавать дополнительные файлы, которые еще не были переданы, вам необходимо дополнительно использовать параметр `--existing``.

К сожалению, кажется, что rsync не выводит, какие файлы он удаляет, даже если используются опции --verbose --itemize-changes --stats .

пример

# create source and target dirs
mkdir /tmp/source
mkdir /tmp/target
# create a test file in source
touch /tmp/source/test
# rsync source and target
rsync --archive --itemize-changes --verbose --stats /tmp/source/ /tmp/target
# verify that test has been copied to target
[ -f /tmp/target/test ] && echo "Found" || echo "Not found"
# create another file in source
touch /tmp/source/test2
# delete files on source which are already existing on target
rsync --archive --itemize-changes --verbose --stats --remove-source-files --existing /tmp/source/ /tmp/target
# verify that test has been deleted on source
[ -f /tmp/source/test ] && echo "Found" || echo "Not found"
# verify that test2 still exists on source and was not transferred to target
[ -f /tmp/source/test2 ] && echo "Found" || echo "Not found"
[ -f /tmp/target/test2 ] && echo "Found" || echo "Not found"
1

Как написано ранее, rsync не будет удалять из источника, только в месте назначения.

В вашем случае я бы сгенерировал MD5-хэши файлов на зеркальном сервере, затем проверил на основном сервере, верны ли хэши, и удалил эти файлы.

То есть:

mirror$ find . -type f -print0 | xargs -0 md5sum > mirror.md5

..transfer mirror.md5 на основной сервер ...

primary$ md5sum -c mirror.md5

Проверьте наличие файлов FAILED, затем удалите файлы, которые были успешно переданы. Вы можете автоматизировать это так:

md5sum -c mirror.md5 | grep 'OK$' | sed -e 's/: OK$//' | while read FILE; do rm "$FILE"; done

Это отфильтрует все файлы с хорошим хешем, отрежет часть 'OK' из md5sum и удалит файлы один за другим.

Излишне говорить, что после этого вы не хотите использовать опцию --delete из rsync для передачи второй половины ваших файлов ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .