完成传输后将文件移动到另一个目录

时间:2012-04-15 16:35:34

标签: python bash ubuntu file-monitoring

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

如果我使用像inotify这样的东西,我如何确保文件在完成移动之前不进行编码?

我考虑过这样做:

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

但是,如何让第2步正常工作,只在#1完成后运行?

我正在使用Ubuntu Server 11.10并且我想使用bash,但如果能够简化问题,我可以说服我使用Python。

我不是"下载"文件到这个目录本身;相反,我绝大部分时间都会使用rsync。

此外,此Ubuntu服务器正在VM上运行。

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

3 个答案:

答案 0 :(得分:2)

最简单的方法是使用wgetcurl之类的程序下载,直到文件下载完毕才会退出。如果做不到这一点,我不确定它是否是绝对最佳解决方案,但您可以使用循环脚本,使用lsofgrep检查文件是否已打开:

while lsof | grep /path/to/download >/dev/null; do sleep 5; done
mv /path/to/download /path/to/encode/dir

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

inotifywait -e close_write "$download_file"
mv "$download_file" "$new_location"