Я смонтировал удаленный общий ресурс Windows (именно здесь будут архивироваться мои резервные копии на ленту).
У меня есть 70 ГБ данных, которые не так сильно меняются, поэтому я хочу использовать RSYNC для зеркалирования данных.
/usr/bin/rsync -rlptDv -e ssh --delete \
--exclude "*Locks" --exclude "tmp" --bwlimit=0 \
--modify-window=1 /cvs1/* localhost:/mnt/DUBBU01/Linux/Buzz/cvs1/
Теперь это работает нормально, поскольку файлы не обновляются. Честно говоря, сделанные разрешения для папок чертовски важны, так как их можно сбросить, если мне когда-либо придется восстанавливать из резервной копии.
ОДНАКО каждая папка копируется. Не их содержимое, а только папки. Есть ли способ исключить папки, содержащие данные, но не сами данные?
Огромное количество опций в rsync доказывает боль, чтобы проверить это. А с миллионом файлов и парой сотен тысяч каталогов сборка файла может занять некоторое время ...
Имеет ли значение, что он каждый раз рассматривал возможность делать что-то с каталогами? Я заметил такое поведение с некоторыми из наших резервных копий rsync из общих ресурсов CIFS, но проигнорировал его, так как худшее влияние, которое оно оказывает, - это наличие дополнительных строк в файлах журнала, которые нам нужно сканировать, если возникнет проблема для исследования. Это не (в нашем случае) приводит к какой-либо заметной дополнительной передаче данных, поскольку ни один из файлов не затрагивается, если они сами не были изменены, и если удаленные папки вообще не обрабатываются, самое большее, что происходит, - это настройка владение / разрешение / даты, которое не вызовет значительной нагрузки ввода-вывода, поэтому займет много времени.
Редактировать: В качестве альтернативы их игнорированию вы можете отфильтровать их из вывода, пропустив его через grep -v /$
, поскольку каталоги в журнале имеют завершающие разделители путей, а файлы - нет. Не идеально, но он уберет лишнюю мощность из поля зрения, пока вы не найдете лучшее решение.
Кроме того, просматривая наши самые последние журналы, чтобы убедиться, что команда grep, я замечаю, что она не включая все каталоги, в нашем случае изменяются только те, в которых был контент (и некоторые, в которых его нет, но немного). Два различия между нашими параметрами rsync и теми, которые вы указываете, заключаются в том, что мы не сохраняем разрешения (нет -p
/--perms
) и используют больший --modify-window
(10 секунд, а не 1). Возможно, стоит попробовать --itemize-changes
вариант, чтобы увидеть, дает ли это ключ к разгадке того, почему он хочет коснуться каждого каталога.
То, что вы хотите сделать, должно быть возможным с --relative
(или -R
) вариант и предыдущий запуск find
для создания списка файлов:
find /cvs1 -type f -not \( -name *Locks -o -name tmp \) -print0 > filelist
rsync -pR --modify-window=1 -0 \
--files-from=filelist /mnt/DUBBU01/Linux/Buzz/
Здесь вы создаете список файлов с завершающим нулем (только файлы, а не каталоги) и передаете его в rsync в качестве источника для его операции, сообщая ему о завершении нуля с помощью -0
. Это полезно, чтобы избежать проблем с пробелами и т. Д. В именах файлов.
со страницы руководства rsync:
-R, --relative
Используйте относительные пути. Это означает, что на сервер отправляются полные имена путей, указанные в командной строке, а не только последние части имен файлов. Это особенно полезно, если вы хотите отправить несколько разных каталогов одновременно. Например, если вы использовали эту команду:
rsync -av /foo/bar/baz.c remote:/tmp/
... это создаст файл с именем baz.c
в /tmp/
на удаленной машине. Если вместо этого вы использовали
rsync -avR /foo/bar/baz.c remote:/tmp/
затем файл с именем /tmp/foo/bar/baz.c
будет создан на удаленном компьютере - сохраняется полное имя пути.
У меня была такая же проблема (папки были перечислены в выводе, когда я работал rsync
). Изменения в списке указывали, что разрешения обновлялись каждый раз, и я устранил проблему с помощью --no-p
вариант (я использовал rsync -avz
). В вашем случае разрешения не важны, поэтому я думаю, вы можете просто использовать -rltDv
скорее, чем -rlptDv
.
Я думаю, вам нужен параметр rsync --prune-empty-dirs