Мониторинг событий в файловой системе по мере их возникновения
Я хочу написать script в Ruby или Python, который будет смотреть содержимое каталога и монитора для
1. Any new files
2. Any saves to existing files.
Я не беспокоюсь о том, что в файлах отличается - просто они были сохранены или новы.
script затем возвращает имя файла (с его полным путем), возможно, раз в 2 секунды или что-то в этом роде.
Я хочу сканировать файлы в папках, чтобы
mainfile.txt
images/image1.jpg
images/icons/icon1.png
Все эти файлы/папки должны быть проверены.
В конечном итоге я хочу, чтобы FTP файлы, которые были изменены/добавлены, но я рад согласиться на решение первой части проблемы, поскольку я знаю, как работать с ftp (но обязательно включите это, если вы хотите!)
Я использую OSX 10.5.8
Ответы
Ответ 1
Для рубина вот камень, который может вам помочь:
https://github.com/thibaudgg/rb-fsevent
FSEvent - это система, которую вы хотите использовать в OS X, и это привязка, приносящая ее Ruby, этот камень используется Guard, который я нашел. (Https://github.com/guard/guard)
Вы даже можете подумать о том, как использовать Guard, который обеспечивает хороший api для отслеживания файлов/путей и запуска действия при изменениях.
Изменить: поскольку я опубликовал это, новый камень был выпущен для абстрактной специфики конкретной платформы: https://github.com/guard/listen, этот камень обеспечивает переносимый api для отслеживать события файловой системы на нескольких платформах
Ответ 2
А, смотрю FTP. Как это случилось, я построил что-то подобное для работы. Хотя мой имел дело с несколькими ограничениями, я надеюсь, что у вас их нет, часть, которая сидела на Linux, была легкой. OSX в этот день и возраст в основном представляет собой переупакованный Linux.
Итак, вы должны установить iwatch, в котором используется функция inotify kernel. Если вы не можете использовать iwatch, что было бы очень удивительно, поскольку оно было написано в perl, то источник должен указать вам, как напрямую общаться с inotify. Эта ссылка содержит информацию об использовании python с inotify.
Есть несколько других альтернатив iwatch, но все они подключаются к inotify. Единственной альтернативой является ручное сканирование каталогов на таймере, которое неудобно и его следует избегать. Я сделал это на окнах, и у него есть... проблемы. Если у меня будет такая возможность, я буду переделывать эту секцию.
Ответ 3
http://pypi.python.org/pypi/MacFSEvents/0.2.1
http://pypi.python.org/pypi/pyfsevents/0.2b1
http://pypi.python.org/pypi/pyobjc-framework-FSEvents/2.3
Ответ 4
Я создал рубиновый камень на основе guard для синхронизации файлов с ftp, когда происходят события файловой системы, в стиле Dreamweaver. Это немного молодо, но я использовал его в последние недели без проблем.
Он называется guard-ftpsync, и я считаю, что он решает точную проблему, которую вы имеете.
Ответ 5
Я бы рекомендовал использовать инструмент, предназначенный для описания, который вы описываете - rsync.
rsync сделает все это для вас. Он будет проверять файлы, измененные или новые, и scp их (и оптимизировать, только копируя куски файла, который был изменен, а не весь файл) на целевой хост.
rsync -a mainfile.txt images/image1.jpg images/icons/icon1.png remotehost:/directory/to/sync/files/to
Если вам также нужен список файлов, которые были синхронизированы, вы можете настроить регистрацию rsync, добавив:
-q --log-format="%f"
Однако даже это не похоже на то, что вам нужно. Похоже, вам нужна быстрая репликационная файловая система, а не частая частая копия.
Репликационная файловая система будет знать, что мгновенные изменения сделаны (вы делаете их в файловой системе, в конце концов) и можете делать те же изменения с другой стороны. После первоначальной настройки не требуется никаких действий с вашей стороны. Это может быть невозможно, вам нужно будет более подробно описать ситуацию.