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
Это проверяет каждое изменение файла в этом каталоге.
Небольшое объяснение:
Конечно, вы хотели бы немного изменить этот сценарий, например
Для отдельных файлов я бы рекомендовал использовать
Конечно, есть лучший и более оптимизированный метод, но этот подход работает и определенно потребляет меньше ресурсов, чем Guard. Теперь все зависит от масштабируемости. Если вы собираетесь рекурсивно перечислять все файлы со всеми их атрибутами каждую миллисекунду, это, конечно, потребует больше, но вам это определенно не нужно. Просто установите больший интервал, скажем, 2 секунды, как указано выше, может быть, 10 или 30, если ваш проект не сильно меняется, и вы не против подождать некоторое время, пока команда сработает. И, на мой взгляд, этот подход вполне красиво и просто.
Сторожевой Python library and shell utilities to monitor filesystem events
,