Использование rsync для перемещения (а не копирования) файлов между каталогами?

55

Я использую rsync для копирования файлов в течение некоторого времени. Насколько я понимаю, rsync работает быстрее, чем cp, когда некоторые файлы для передачи уже находятся в целевом каталоге, передавая только инкрементную разницу (т. Е. «Дельты»).

Если это правильно, будет ли какое-либо преимущество использования rsync для перемещения содержимого папки A , скажем, папки B , где B пусто?

Папка A содержит около 1 ТБ данных (и миллионы файлов в ней). Передача будет осуществляться по локальной сети ( A и B находятся в разных файловых системах, оба смонтированы на суперкомпьютере, например, A - NFS, а B - блеск ).

Кроме того, какие флаги я должен использовать, чтобы попросить rsync переместить (не копировать) файлы из A в B (т.е. удалить A, когда передача успешно завершится)?

Амелио Васкес-Рейна
источник
7
Я не думаю, что rsyncможет заменить mv. Я ожидал mvбы быть быстрее на большинстве типов файловых систем, когда источник и место назначения находятся в одной и той же файловой системе, потому rsyncчто должен был бы сделать копию несмотря ни на что, и, mvвероятно, мог бы избежать изменения нескольких записей каталога. Самая близкая вещь, которую я могу найти, rsync mv- это --remove-source-filesкоманда, но она не удаляет каталоги.
jw013
2
Спасибо @ jw013! Просто чтобы уточнить, файлы находятся в разных файловых системах, и передача будет осуществляться по сети . Знаете ли вы, если это все равно будет mvбыстрее?
Амелио Васкес-Рейна
1
Ну, mvне может работать через сеть - он должен полагаться на локальное монтирование (например, NFS). Если узкое место в сети, rsyncвероятно , будет быстрее , чем mvиз - за rsyncможет сделать сжатие.
jw013
2
Кстати, cpесть -uвозможность скопировать исходный файл, если он новее, чем целевой файл или если целевой файл отсутствует
спешите

Ответы:

69

Вы можете перейти --remove-source-filesк rsync для перемещения файлов вместо их копирования.

Но в вашем случае нет смысла использовать rsync, поскольку место назначения пустое. Равнина mvвыполнит работу максимально быстро.

В вашем случае, что может иметь значение для производительности, это выбор сетевого протокола, если у вас есть выбор между NFS, Samba, sshfs, sftp, rsync по ssh, tar по конвейеру в ssh и т. Д. Относительная скорость этих методов зависит по размерам файлов, пропускной способности сети и диска и другим факторам, поэтому нет никакого способа дать общий совет, вам нужно будет выполнить свои собственные тесты.

Жиль "ТАК - перестань быть злым"
источник
6
Просто чтобы повторить то, что говорит Калеб, если вы беспокоитесь о повреждении, например, из-за нестабильной сети, rsync может иметь смысл, так как он проверяет каждый записываемый файл, проверяя контрольные суммы блоков по мере их записи.
Даниэль С. Стерлинг
5
--remove-source-filesудаляет только файлы в источнике. если вы хотите очистить наш источник, не нужно ли будет выполнять команду rm -rf (или findвсе каталоги и проходы -delete) для источника после успешной работы rsync?
Тревор Бойд Смит
1
@ DanielS.Sterling rsync не записывает блоки контрольных сумм после их записи (использует контрольные суммы, чтобы найти, какие части существующих файлов были обновлены и должны быть синхронизированы). Вы можете выполнить вторую синхронизацию с помощью, --checksumчтобы сказать ей, чтобы проверить результаты первой синхронизации.
Климент
19

Поскольку --remove-source-filesкаталоги не удаляются, я запускаю следующие команды для перемещения файлов по ssh:

rsync -avh --progress --remove-source-files /home/user/mystuff/* user@external.server:/home/user/backup
find . -type d -empty -delete

Мне лично нравится эта --progressфункция, так как я делаю эту передачу вручную. Удалите его, если вы используете скрипт. Я ожидаю, что это замедлит переводы незначительно. Параметр findудаления команды удаляет только пустые каталоги - не используйте rm -rf, так как он может удалить непустые каталоги в случае, если файл не был передан. В -deleteопции включает -depthопцию , так что пустые дерева каталогов будут удалены из «снизу» вверх.

Kristian
источник
3
-deleteнамного лучше, чем -exec rmdir {} +т. д.
lkraav
1
Я бы пропустил звездочку, потому что и делал бы косые черты / с путями, если делал это локально. Если вы используете звездочку, rsync пропустит скрытые файлы, такие как .htaccess или .htpasswd (если есть)
Святослав Маринов
16

В целом, как сказал Жиль, нет никакого преимущества в использовании rsyncдля перемещения файлов, когда mvбудет проще выполнить ту же работу, и нет никакого потенциального увеличения скорости между обычными файловыми системами.

Есть, однако, несколько раз, когда есть преимущество. В частности, если у вас есть какие-либо сомнения относительно стабильности источника, места назначения или машины, выполняющей работу, использование rsyncдает вам возможность возобновления. Это может быть заметным преимуществом, если вы переводите очень большой и, скажем, ваша энергосистема ненадежна. Использование rsync будет более стабильным способом избежать повреждения данных в случае сбоя и выбрать место, где вы остановились.

Калеб
источник
5
Я бы сказал, что это огромное преимущество. На самом деле, я бы сказал, mvчто лучше, если цель и источник находятся в одном и том же разделе, так что mvвместо копирования копируются только метаданные файла.
номен
2
Один раз мне нужно, rsyncа не mv, это когда я хочу сохранить структуру папок (если вы используете --relative).
Шридхар Сарнобат
15

Будет ли какое-либо преимущество использования rsync для перемещения содержимого папки A, скажем, папки B, где B пусто?

Я оказался в ситуации, когда rsync работает быстрее, чем mv просто потому, что mv не может обработать количество файлов в каталоге. У меня 1,8 миллиона фотографий с камеры слежения, которая работала в течение 20 дней, и команда mv завершается с ошибкой, поскольку не может выделить ресурсы.

Однако rsync, похоже, обрабатывает все файлы без проблем.

shadowv
источник
1

Если вы хотите рекурсивно объединять каталоги ... переместите один каталог в другой каталог с потенциально дублирующимися именами каталогов, тогда, пожалуйста, посмотрите мой ответ здесь на serverfault.com. mvвыполняет плохую работу, когда существуют каталоги с одинаковыми именами, и rsyncкопирует (читает + записывает полные данные) каждый файл, а не просто перемещает их (метаданные только для чтения и записи).

Питер
источник
0

Нет способа переместить файлы с помощью rsync, как это сделала бы команда Linux mv. Используя --remove-source-files, вы по сути копируете файлы в место назначения, а затем удаляете файлы (кроме каталогов) из источника. Это может помочь вам переместить файлы, но вы НЕ сэкономите время и операции ввода-вывода.

Гехендра Ачарья
источник