简而言之,我可能需要在 bash 中一个简单的循环,它定期检查给定文件的大小自上次检查以来是否已更改。
长话短说,我将下载一个文件我的文件.txt使用火狐浏览器。我想运行一个命令下载完成后。 Firefox 似乎没有提供我可以使用的 dbus 调用。存在一些具有上述功能的附加组件,但我需要一个相当可靠的解决方案。所以我想我可以运行一个 bash 脚本来定期检查我的文件.txt随着时间的推移而改变,或者已经稳定下来。该文件是大小 <=5mb 的文本文件,将被下载本地,所以它非常可靠,下载应该线性运行(没有断开连接,服务器问题等)。
你能帮我写这么简单的bash脚本吗?探测文件的频率似乎确实是使事情有效工作的关键。正如我所说,它是一个 <=5mb 的文本文件,但可以小至 10kb,驻留在 SSD 驱动器上。
另外,也许有更好的方法来实现这一目标?就像我说的,我需要一个在 Linux 中运行且依赖性最小的可靠解决方案。也许是下载管理器?或者任何文件监控守护进程?或者为此提供一个文件系统 API?或者使用访问时间而不是大小?
答案1
假设唯一打开文件的是执行下载的程序,则命令
/usr/sbin/lsof path/to/your/file | wc -l
如果文件仍然打开,则应返回 2;如果没有人打开它,则应返回 0。
两个是因为第一行是列标签列表,第二行是文件的状态行。
下载完成后,任何人都不应打开该文件。
您可以在民意调查中使用该结果。
您需要完整路径,lsof
因为它通常是管理员命令,因此位于/usr/sbin
.它可能具有只有超级用户才能使用的选项,但这不是其中之一。
答案2
如果您只想等到文件未更改,则类似
size=0
size2=$(stat --printf=%s $filename)
while [ $size != $size2 ]
do
sleep 5
size=$size2
size2=$(stat --printf=%s $filename)
done
如果您能够编写一些 C 代码,那么使用 inotify(7) 调用集可能会有所帮助;您可以在 CLOSE 事件上触发操作。