用于监视共享文件夹中新文件的脚本(Windows 主机、Linux 来宾)

用于监视共享文件夹中新文件的脚本(Windows 主机、Linux 来宾)

我需要监视一个共享文件夹,在这种特定情况下,主机是 Windows,来宾是 Ubuntu Linux,以查看新文件或已更改的文件。理想情况下,该解决方案应独立于主机或将文件放入共享目录的计算机而工作。新文件将作为不同进程的输入。

如果文件是由主机创建并放入共享文件夹中,inotifywait 工具集不会检测新文件。

我有什么选择?

答案1

您需要轮询文件更改的东西,因为如果文件在 Windows 端被修改,Linux 内核将不会知道它。有一些现有的应用程序可以帮助解决这个问题,例如 Guard:http://guardgem.org/

根据您的具体需要,您可以只watch列出文件(将 n 秒调整为合适的值):

watch --differences -n 10 ls -l </path/to/shared/dir>

答案2

您也许可以使用早于日期的投票工具之一通知inotify:加明或者家族,以及类似的东西文件已更改这是一个inotifywait类似 CLI 的工具。 gamin 和 fam 项目是相关的,并且都相当古老(尽管 gamin 稍微不那么古老)。

对于我使用过的简单且便携的任务像这样的东西通过计划任务:

if mkdir /var/lock/mylock; then
  ( cd /mnt/mypath; find . -type f -mmin +2 ) | myprocess
  rmdir /var/lock/mylock
else
  logger -p local0.notice "mylock found, skipping run"
fi

这使用原始锁定和 GNUfind条件来仅查找文件较老的不到两分钟,我就可以确定文件已完全写入。就我而言,myprocess文件rsync --remove-source-files --files-from=-一旦被处理就会被删除。

这种方法还允许您使用//find -print0来处理麻烦的文件名。xargs -0rsync -0

如果您必须将所有(旧的和新的)文件保留在同一目录层次结构中,那么构建目录列表快照并比较它们可能也适合您:

if mkdir /var/lock/mylock; then
  ( 
    export LC_COLLATE=C  # for sort
    cd /mnt/mypath
    find . -type f -a \! -name ".dirlist.*" -printf '%p\0' | 
      while read -d '' file; do
        printf "%q\n" "${file}"  
      done > .dirlist.new
    [[ -f  .dirlist.old ]] && {
      comm -13 <(sort .dirlist.old) <(sort .dirlist.new) |
        while read -r file; do
          myprocess "${file}"
        done
    }
    mv .dirlist.new .dirlist.new
  )
  rmdir /var/lock/mylock
else
  logger -p local0.notice "mylock found, skipping run"
fi

这个bash脚本:

  1. 用于find -printf打印 \0 (nul) 分隔的文件列表
  2. 用于read -d ''处理该列表,并printf %q在必要时转义文件名
  3. 比较新的和以前的 .dirlist 文件
  4. 调用myprocess每个新文件(安全引用)

(还处理修改的文件需要稍微多一些努力,可以使用双行格式find ... -printf '%p\0%s %Ts\0',并对while循环进行相关更改。)

答案3

如果您熟悉node.js及其生态系统,您可以使用这个图书馆 对共享文件夹实施轮询。

相关内容