Проверьте, изменилось ли содержимое каталога с помощью Shell script или python

У меня есть программа, которая создает файлы в определенном каталоге. Когда эти файлы будут готовы, я запускаю Latex для создания .файл PDF. Итак, мой вопрос, как я могу использовать это изменение каталога, в качестве триггера чтобы вызвать Latex, используя сценарий оболочки или скрипт python?

С Наилучшими Пожеланиями

7 ответов


inotify заменяет dnotify.

почему?

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

кроме того, файловый дескриптор закрепляет каталог, запрещая размонтировать резервное устройство, что вызывает проблемы в сценариях со съемными носителями. При использовании inotify, если вы смотрите файл в файловой системе, которая размонтирована, часы автоматически удаляется и появляется событие unmount.

...и еще.

Почему?

В отличие от своего предка dnotify, inotify не усложняет вашу работу различными ограничениями. Например, при просмотре файлов на съемном носителе эти файлы не блокируются. По сравнению с ним dnotify требует, чтобы сами файлы были открыты и, таким образом, действительно "блокирует" их (препятствует размонтированию пресса.)

ссылка


Is подсистема dnotify что вам нужно?


Make в системах unix обычно используется для отслеживания по дате, что необходимо перестроить, когда файлы изменились. Обычно я использую довольно хороший makefile для этой работы. Кажется, есть еще один альтернатива вокруг на Google тоже код


вам не только нужно проверить наличие изменений, но и знать, что все изменения завершены перед запуском LaTeX. Например, если вы запустите LaTeX после изменения первого файла и пока еще не внесены дополнительные изменения, вы будете использовать частичные данные, и вам придется перезапустить их позже.

дождитесь завершения первой программы:

#!/bin/bash
first-program &&
  run-after-changes-complete

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


Python FAM - это интерфейс Python для FAM (Монитор Изменения Файла)

вы также можете посмотреть Pyinotify, который является модулем для мониторинга изменений файловой системы.


сам не очень похож на питона. Но в крайнем случае, предполагая, что вы находитесь в linux, вы можете периодически выкладывать и "LS-lrt /path/to/directory" (получить содержимое каталога и отсортировать по последним изменениям) и сравнивать результаты последних двух вызовов для разницы. Если так, значит, что-то изменилось. Не очень подробно, но работа сделана.


вы можете использовать собственный модуль python hashlib, который реализует алгоритм MD5:

>>> import hashlib
>>> import os
>>> m = hashlib.md5()
>>> for root, dirs, files in os.walk(path):
    for file_read in files:
        full_path = os.path.join(root, file_read)
        for line in open(full_path).readlines():
            m.update(line)


>>> m.digest()
'pQ\x1b\xb9oC\x9bl\xea\xbf\x1d\xda\x16\xfe8\xcf'

вы можете сохранить результат в файл или переменную, и сравнить его с результатом следующего запуска. Это позволит обнаружить изменения в любых файлах, в любом подкаталоге.

это не учитывает изменения разрешений файла; если вам нужно отслеживать эти изменения, а также, это может быть устранено путем добавления строки, представляющей разрешения (доступно через os.stat для например, атрибуты зависят от вашей системы) к mпеременной.