6

我有一个视频编码脚本,我想在文件移动到特定目录后立即运行它。

如果我使用 inotify 之类的东西,如何确保文件在完成移动之前不会被编码?

我考虑过做类似的事情:

  • 将 (rsync) 文件复制到临时目录中。
  • 完成后,将(简单的'mv')移动到编码目录。
  • 让我的脚本监视编码目录。

但是,如何让步骤 #2 正常工作并且仅在 #1 完成后运行?

我正在使用 Ubuntu Server 11.10,我想使用 bash,但如果这样可以简化问题,我可能会被说服使用 Python。

我本身并不是将文件“下载”到此目录中;相反,我将在绝大多数时间使用 rsync。

此外,此 Ubuntu Server 正在 VM 上运行。

我通过 NFS 从 FreeBSD 服务器安装了我的主文件存储。

4

3 回答 3

2

最简单的方法是使用类似wgetcurl在文件完成下载之前不会退出的程序进行下载。如果做不到这一点,我不确定这是否是绝对最好的解决方案,但您可以使用循环的脚本,检查文件是否打开使用lsofand grep

while lsof | grep /path/to/download >/dev/null; do sleep 5; done
mv /path/to/download /path/to/encode/dir
于 2012-04-15T17:01:55.960 回答
1

我使用的一种技术适用于 FTP。您向 FTP 服务器发出命令以将文件传输到辅助目录。命令完成后,您向服务器发送第二条命令,这一次告诉它将文件从 aux 目录重命名为最终目标目录。如果您使用 inotify 或轮询目录,文件名将不会出现直到重命名完成,因此,您可以保证文件是完整的。

我对 rsync 不熟悉,所以我不知道它是否具有类似的重命名功能。

于 2012-04-16T14:52:32.450 回答
0

inotifywait看起来很有希望。您必须小心一点,因为如果在设置通知之前下载完成,它将永远等待。

inotifywait -e close_write "$download_file"
mv "$download_file" "$new_location"
于 2012-04-16T14:34:43.483 回答