Linux: выполнить данную команду при изменении файла / каталога?

Я знаю о inotifywait/inotifywatch от inotify-tools, о entr ( http://entrproject.org/) и дюжина сценариев оболочки, но они не то, что мне нужно.

Мне нужно что-то похожее на guard ( https://github.com/guard/guard).

Они работают так: вы создаете файл в каталоге, который указывает, что нужно отслеживать и что делать, когда эти файлы изменяются.

С охраной все в порядке, но это: 1) ресурсоемкий ресурс (а в больших проектах он медленный), 2) требуется целый Ruby + куча гемов зависимости, 3) требуется плагин для запуска команд оболочки.

Есть также tup ( http://gittup.org/tup/), и это чертовски круто, за исключением одного чрезвычайно глупого ограничения: он не может выводить в каталоги, кроме тех, где Tupfile является. Его способ заключается в создании Tupfile в каждом подкаталоге, и это не работает для меня.

Что я хочу в итоге: я указываю шаблоны файлов и каталоги (если нет, то наблюдаю за всеми) в каком-то файле, запускаю какую-то команду, и она отслеживает вещи, соответствующие заданным правилам, всякий раз, когда файлы изменяются / добавляются, они выполняют данные команды. Это оно.

Какие-либо предложения?

2 ответа

Вот что я быстро подумал:

      #!/usr/bin/env bash
trap exit SIGQUIT SIGINT
while :; do
  watch -n2 -g ls -l /path/to/dir && do_something && do_something_else
done

Это проверяет каждое изменение файла в этом каталоге.

Небольшое объяснение:завершает работу с кодом состояния 0, когда обнаруживает изменение в выводе команды. При выходе он выполняет следующие команды, связанные с условными выражениями оболочки (их может быть сколько угодно). Затем вы просто зацикливаете это навсегда, пока не нажмете(это то, чтодля).

Конечно, вы хотели бы немного изменить этот сценарий, напримерза временной интервал обновлений. Чем больше вы его обновляете, тем больше ресурсов вы тратите.

Для отдельных файлов я бы рекомендовал использоватькоманда, поскольку она проверяет даты изменений и даже изменения разрешений и владельцев.

Конечно, есть лучший и более оптимизированный метод, но этот подход работает и определенно потребляет меньше ресурсов, чем Guard. Теперь все зависит от масштабируемости. Если вы собираетесь рекурсивно перечислять все файлы со всеми их атрибутами каждую миллисекунду, это, конечно, потребует больше, но вам это определенно не нужно. Просто установите больший интервал, скажем, 2 секунды, как указано выше, может быть, 10 или 30, если ваш проект не сильно меняется, и вы не против подождать некоторое время, пока команда сработает. И, на мой взгляд, этот подход вполне красиво и просто.

Сторожевой Python library and shell utilities to monitor filesystem events,

Другие вопросы по тегам