У меня есть каталог, в котором есть много папок с кодом внутри, и мне нужно запустить сценарий, чтобы rsync переключился на пару других серверов. У меня этот сценарий написан и работает нормально, но я не могу найти что-нибудь, что проверяет дерево каталогов на наличие изменений. Я пробовал stat, но проверял только одну папку, а не рекурсивно (насколько я мог понять). Кто-нибудь знает команду или программу, которую я мог бы установить для этого? Я использую Ubuntu 10.04. Заранее спасибо.
Идеальный инструмент для этой работы - использование службы ядра inotify. Вы можете использовать их в сценарии оболочки с пакетом inotify-tools (debian / ubuntu). Вы можете прочитать больше и увидеть некоторые примеры на страница проекта. На странице даже есть пример, который, кажется, делает что-то близкое к тому, что вы хотите:
#!/bin/sh
# get the current path
CURPATH=`pwd`
inotifywait -mr --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' \
-e close_write /tmp/test | while read date time dir file; do
FILECHANGE=${dir}${file}
# convert absolute path to relative
FILECHANGEREL=`echo "$FILECHANGE" | sed 's_'$CURPATH'/__'`
rsync --progress --relative -vrae 'ssh -p 22' $FILECHANGEREL usernam@example.com:/backup/root/dir && \
echo "At ${time} on ${date}, file $FILECHANGE was backed up via rsync"
done
inotifywait
будет выполнять рекурсивные проверки.
Это в Репозитории Ubuntu.
rsync проверит дерево каталогов на наличие изменений и скопирует только измененные файлы, если вы укажете каталог в качестве источника.
Посмотри на inotify. Некоторое время назад я решил аналогичную проблему с помощью dnotify или sgi_fam (не помню, какие именно), но inotify, похоже, заменил их обоих.
Кто-то уже изобрел это колесо. Это называется lsyncd и, по-видимому, это смесь rsync и inotify. Я сам не использовал его, потому что ограничения inotify таковы, что он не масштабируется до действительно больших (и глубоких) каталогов. Я жду, пока они его не реализуют напрямую, используя fsnotify.
Есть также PIrsyncD который, кажется, делает то же самое.
использовать найти
find /path -mmin 1
Это проверит, был ли файл или каталог изменен 1 минуту назад, посмотрите страницу руководства для получения дополнительных опций.