使用Shell脚本或Python检查目录内容是否已更改

6
我有一个程序,它会在特定目录中创建文件。当这些文件准备好时,我运行Latex生成一个.pdf文件。那么,我的问题是,如何使用这个目录变化作为触发器来调用Latex,使用shell脚本或python脚本?
最好的问候
7个回答

5

inotify取代了dnotify

为什么呢?

...dnotify需要为每个要监视更改的目录打开一个文件描述符...

此外,文件描述符会锁定目录,防止后备设备被卸载,在涉及可移动介质的情况下会引起问题。使用inotify时,如果你正在监视已经被卸载的文件系统上的文件,则自动删除监视并接收卸载事件。

...等等。

更多为什么?

与其祖先dnotify不同,inotify不会通过各种限制使你的工作复杂化。例如,如果您在可移动介质上监视文件,则这些文件不会被锁定。相比之下,dnotify需要打开文件本身,因此实际上“锁定”它们(妨碍卸载介质)。

参考资料


3

在运行LaTeX之前,您不仅需要检查更改,还需要知道所有更改都已完成。例如,如果您在第一个文件被修改后启动LaTeX,而其他更改仍在等待中,那么您将使用部分数据并且需要稍后重新运行。

等待您的第一个程序完成:

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

使用 && 表示只有当第一个命令成功完成(零退出代码)时才会执行第二个命令。由于这个简单的脚本即使第一个命令没有更改任何文件也会始终运行第二个命令,因此您可以将其合并到您已经熟悉的任何构建系统中,例如 make。


3

3

在Unix系统中,make通常用于跟踪文件更改时需要重新构建的内容。我通常使用一个相当不错的Makefile来完成这项工作。似乎还有另一个替代方案在Google代码中也可以使用。


2
Python FAM 是一个Python接口,用于FAM(文件变更监视器)。
你也可以看看Pyinotify,它是一个用于监视文件系统变化的模块。

1

我自己不是很擅长Python。但在紧急情况下,假设您正在使用Linux,您可以定期执行"ls -lrt /path/to/directory"(获取目录内容并按最后修改时间排序),并比较最后两个调用的结果是否有差异。如果有差异,则表示发生了更改。虽然不是非常详细,但可以完成工作。


0
你可以使用本地的 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变量来解决。


在计算机资源方面需要多少成本? - Tedo Vrbanec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接