Вопрос или проблема
Мой недельный скрипт резервного копирования содержит кучу команд bash, подобные этим:
rsync -va /source_path/ /destination_path/
Теперь это работает отлично, но опция -v (подробный вывод) не ведет себя так, как я хочу. Я хочу, чтобы отображались только измененные файлы, которые копируются, а не каждая папка, которую он сканирует.
Например, если папки document1
и document2
не изменились, но файл изменен в document3
, тогда вывод будет следующим:
document1/
document2/
document3/
document3/foo.txt
Если я полностью опущу опцию -v
, то она будет совсем тихой и не отобразит ничего. Я хочу вывод, но мне интересна только последняя строка (foo.txt), а не десятки папок, которые rsync
сканирует, таких как document1, document2 и т.д.
Есть ли способ это сделать?
Ваше описание уже отражает, как работает rsync
. Единственные файлы, которые он отображает с опцией -v, это те, которые он либо передает, либо изменяет. Таким образом, каждый раз, когда он запускается, он видит, что есть какое-то различие в директориях.
Распространенной причиной этого является то, что источник и назначение находятся на разных файловых системах, и права собственности или разрешения не могут быть скопированы точно, и каждый вызов пытается это сделать.
Чтобы подтвердить это, выполните rsync
с -i
(или --itemize-changes
). Это отобразит код, который покажет причину, по которой rsync
решил, что с файлом нужно что-то сделать. Если это проблема с правами собственности или что-то подобное (и вы решите, что эта информация вам не нужна), вы можете отключить синхронизацию с помощью --no-owner
или подобного.
Вы можете отображать только измененные файлы вместо папок, используя grep
.
rsync -va /source_path/ /destination_path/ | grep -v '/$'
Это отобразит только:
document3/foo.txt
Вы можете еще больше улучшить читаемость, разделив измененные файлы с помощью =
и убрав ненужный вывод:
rsync -va /source_path/ /destination_path/ | grep -v '/$' | sed '/^sending incremental file list/i\========================================' | grep -v '^sending incremental file list'
Ответ или решение
Чтобы сделать так, чтобы команда rsync отображала только измененные файлы и не выводила все проверяемые папки, можно использовать несколько подходов. Давайте рассмотрим наиболее подходящее решение для вашего сценария резервного копирования с помощью rsync.
Основные команды rsync
Ваша начальная команда выглядит следующим образом:
rsync -va /source_path/ /destination_path/
Флаг -v
(verbose) действительно выводит информацию о каждом элементе, который проверяется, включая папки. Однако, для достижения вашего желаемого результата, есть несколько способов отфильтровать вывод.
Использование grep для фильтрации вывода
Одним из простых решений является использование команды grep
для фильтрации вывода rsync. В данном случае вы можете использовать следующее:
rsync -va /source_path/ /destination_path/ | grep -v '/$'
Этот подход позволяет исключить из вывода строки, заканчивающиеся на /
, которые представляют собой папки. В результате в выводе останутся только файлы, которые были изменены или скопированы.
Улучшение читаемости вывода
Чтобы улучшить читаемость, вы можете дополнительно разделить изначально выведенные файлы с помощью команды sed
и убрать ненужные строки. То есть, вы можете использовать следующую команду:
rsync -va /source_path/ /destination_path/ | grep -v '/$' | sed '/^sending incremental file list/i\========================================' | grep -v '^sending incremental file list'
Здесь мы добавляем разделитель (========================================
) перед выводом перенесенных файлов, чтобы было легче визуально выделить изменения.
Дополнительные параметры rsync
Если проблема не только в выводе, но также возникают вопросы о том, какие файлы подлежат копированию, вам стоит проверить параметры, которые повлияли на процесс синхронизации. Например, если между файловыми системами имеются различия в разрешениях или владельцах, rsync будет помечать файлы как измененные. Для исключения таких метаданных, используйте флаги вроде --no-owner
, --no-group
и --no-perms
.
Заключение
Следуя приведенным шагам, вы сможете настроить вывод rsync так, чтобы он соответствовал вашим требованиям. Используя комбинацию grep
и sed
, можно добиться четкого и понятного отображения только измененных файлов. Если вам понадобятся дополнительные изменения, не стесняйтесь задавать вопросы, и я с радостью помогу вам оптимизировать ваши сценарии резервного копирования!