从不断更新的目录中读取更新

时间:2017-10-25 16:23:59

标签: linux bash shell

我正在编写一个bash脚本,它查看目录中的每个文件并对其执行某种操作。它应该看起来像这样(也许?)。

for file in "$dir"* ; do
    something
done

很酷,对吗?问题是,此目录正在频繁更新(使用新文件)。无法保证,在某些时候,我将技术上完成dir中的所有文件(因此退出for循环),但实际上并没有使用额外的文件来完成目录。我无法保证永远不会完成目录(好吧......带着一点点盐)。

我不想多次处理同一个文件。

我正在考虑制作一个永远运行的while循环并不断更新某些文件列表A,同时制作另一个文件列表B来跟踪我已处理的所有文件,以及文件列表A中的第一个文件不在文件列表B中的处理。

有更好的方法吗?这种方法是否有效?感谢

编辑:强制性"我是bash newb"

1 个答案:

答案 0 :(得分:2)

@Barmar有一个很好的建议。解决此问题的一种方法是使用inotify来监视新文件。在系统上安装inotify-tools后,您可以使用inotifywait命令将新文件事件提供给循环。

您可以从以下内容开始:

inotifywait -m -e MOVED_TO,CLOSED_WRITE myfolder |
while read dir events file, do
  echo "Processing file $file"
  ...do something with $dir/$file...
  mv $dir/$file /some/place/for/processed/files
done

inotifywait命令将为(a)移动到目录中的文件和(b)打开以进行写入后关闭的文件生成事件。这通常可以满足您的需求,但总会有一些特殊情况取决于您的特定应用。

inotifywait的输出类似于:

tmp/work/ CLOSE_WRITE,CLOSE file1
tmp/work/ MOVED_TO file2