【问题标题】:Move file to another directory once it is done transferring完成传输后将文件移动到另一个目录
【发布时间】:2012-04-27 04:16:21
【问题描述】:

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

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

我考虑过这样做:

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

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

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

我并没有将文件“下载”到这个目录中,就其本身而言;相反,我将在绝大多数时间使用 rsync。

此外,此 Ubuntu Server 正在虚拟机上运行。

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

【问题讨论】:

    标签: python bash ubuntu file-monitoring


    【解决方案1】:

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

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

    【讨论】:

    • rsync 确实以同样的方式工作 - 文件在完成传输之前不会显示在要编码的文件列表中。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 这应该在紧要关头工作,但我想尽可能避免轮询。
      猜你喜欢
      • 1970-01-01
      • 2017-07-20
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      • 2020-09-02
      相关资源
      最近更新 更多