制作一个监视文件夹等待文件完成渲染

时间:2015-09-14 19:08:31

标签: macos shell ffmpeg

我试图设置一个监视文件夹(使用fswatch),该文件夹开始使用ffmpeg将接收的文件转换为另一种格式(将该部分整理出来)。 到目前为止一切顺利,我遇到的问题是让脚本等到原始输入(或主文件)完成渲染或完全复制到我的监视文件夹中。

这是文件夹

的脚本
fswatch -o ~/Desktop/autom_shell| xargs -n1 ~/Desktop/scripts_autom_shell/move_QT.sh

move_QT.sh过滤并将quicktime影片从我的接收文件夹移动到我编码的文件夹。

我已经搜索了一个解决方案并找到kqwait,但我完全不知道如何应用它。

MacOS 10.10

3 个答案:

答案 0 :(得分:0)

我已经查看了kqwait的源代码,并阅读了fswatch上的文档,尽管名称为kqwait,但大多数这些实用程序都具有相同的基本设计。

他们等待文件系统中发生操作的通知,这意味着删除,重命名和写入。他们真正做的是在应用程序中的操作完成时通知您。有关于"写"的通知表明该文件已被关闭的通知,但大多数这些实用程序的意图不是等待它发生(尽管名称为kqwait)。

大多数这些实用程序都要等到文件系统上发生任何事情,过滤以对该文件系统中的特定文件或目录做出反应。只有当您等待一系列书面通知的近距离通知时,您才有可能按照您的意愿行事。即使这样,也不清楚关闭通知实际上可靠地表明文件的接收是完整的。它只是意味着停止写作。在不知道应用程序的行为的情况下,这可能意味着连接被删除且文件不完整,并且可能会在后续尝试中恢复。

您真正需要的是能够在更高级别的事件上接收通知,而不是文件系统中发生的事件。

但是,除此之外,您可以管理的最好方法是响应fswatch(或类似命令),这表示写入已经开始,然后监视您确定的任何新文件是否是感兴趣的传入文件看看他们是否继续成长(或者你继续收到来自fswatch的通知,写作仍在继续)。然后,经过足够的时间,脚本观察到文件大小不再增长,或者已经过了足够的时间,而fswatch不再通知写入正在发生,您可以假设文件已完成并尝试启动转换。

这不仅仅是对样本帖子的修正 - 它编写了一个有限复杂度的脚本,选择了多种设计途径中的任何一种,所有这些都是基于不明确的假设(应该经过多长时间)例如,假设接收完成了。

答案 1 :(得分:0)

回答我自己的问题:

我尝试了一些方法,并且出于各种原因,决定检查CPU负载。 我使用以下代码

prev_size=-1 # initialize variable
new_size=`/usr/bin/du -sk "$file_i" | awk '{print $1}'` # get current file size

while [ $prev_size != $new_size ] # repeat until these values are the same
do
/bin/sleep 5 # check every 5 seconds
tmp_size=$new_size # move to intermediate value
new_size=`/usr/bin/du -sk "$file_i" | awk '{print $1}'` # get new file size
prev_size=$tmp_size
done

我发现here,依赖于目录大小。 虽然它并不完美,但它对我的目的来说还不错。 希望我有更多的时间来处理这个问题,完成后会将代码发布到我的脚本中。

答案 2 :(得分:0)

fswatch -xn /Users/...... | while read file; do
 while [ `lsof -t $file` > 0 ]; do sleep .1; done
  ffmpeg........
done