Мониторинг событий в файловой системе по мере их возникновения

Я хочу написать 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. Единственной альтернативой является ручное сканирование каталогов на таймере, которое неудобно и его следует избегать. Я сделал это на окнах, и у него есть... проблемы. Если у меня будет такая возможность, я буду переделывать эту секцию.

Ответ 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"

Однако даже это не похоже на то, что вам нужно. Похоже, вам нужна быстрая репликационная файловая система, а не частая частая копия.

Репликационная файловая система будет знать, что мгновенные изменения сделаны (вы делаете их в файловой системе, в конце концов) и можете делать те же изменения с другой стороны. После первоначальной настройки не требуется никаких действий с вашей стороны. Это может быть невозможно, вам нужно будет более подробно описать ситуацию.