Проверьте, изменилось ли содержимое каталога с помощью сценария оболочки или python - PullRequest
6 голосов
/ 01 февраля 2011

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

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

Ответы [ 7 ]

5 голосов
/ 01 февраля 2011

inotify заменяет dnotify.

Почему?

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

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

... и другие.

Подробнее Почему?

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

Ссылка

3 голосов
/ 01 февраля 2011

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

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

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

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

3 голосов
/ 01 февраля 2011

Make в системах Unix обычно используется для отслеживания по дате, что нужно пересоздать, когда файлы изменились.Я обычно использую довольно хороший make-файл для этой работы.Похоже, есть еще одна альтернатива в коде Google тоже

3 голосов
/ 01 февраля 2011

Является ли знать , что вам нужно?

2 голосов
/ 01 февраля 2011

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

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

1 голос
/ 01 февраля 2011

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

0 голосов
/ 01 февраля 2011

Вы можете использовать собственный модуль 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...