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

Python 传输完成后,将文件移动到另一个目录,python,bash,ubuntu,file-monitoring,Python,Bash,Ubuntu,File Monitoring,我有一个视频编码脚本,我希望在文件移动到特定目录后立即运行该脚本 如果我使用类似inotify的东西,如何确保文件在移动完成之前不会被编码 我考虑过做一些类似的事情: 将(rsync)文件复制到临时目录中 完成后,将(简单的“mv”)移动到encode目录中 让我的脚本监视编码目录 但是,如何使步骤2正常工作,并且只在步骤1完成后运行一次 我正在使用UbuntuServer11.10,我想使用bash,但如果可以简化问题,我可能会被说服使用Python 我不是“下载”文件到这个目录,本身;相

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

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

我考虑过做一些类似的事情:

  • 将(rsync)文件复制到临时目录中
  • 完成后,将(简单的“mv”)移动到encode目录中
  • 让我的脚本监视编码目录
但是,如何使步骤2正常工作,并且只在步骤1完成后运行一次

我正在使用UbuntuServer11.10,我想使用bash,但如果可以简化问题,我可能会被说服使用Python

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

此外,这个Ubuntu服务器运行在虚拟机上


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

最简单的方法是使用类似于
wget
curl
的程序进行下载,直到文件下载完成后才会退出。如果做不到这一点,我不确定这是否是绝对最佳的解决方案,但您可以使用循环脚本,使用
lsof
grep
检查文件是否打开:

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

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

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

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


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

这在紧急情况下应该可以工作,但如果可能的话,我希望避免轮询。rsync的工作方式是相同的-文件在传输完成之前不会显示在要编码的文件列表中。