我正在编写一个bash脚本,它查看目录中的每个文件并对其执行某种操作。它应该看起来像这样(也许?)。
for file in "$dir"* ; do
something
done
很酷,对吗?问题是,此目录正在频繁更新(使用新文件)。无法保证,在某些时候,我将技术上完成dir中的所有文件(因此退出for循环),但实际上并没有使用额外的文件来完成目录。我无法保证永远不会完成目录(好吧......带着一点点盐)。
我不想多次处理同一个文件。
我正在考虑制作一个永远运行的while循环并不断更新某些文件列表A,同时制作另一个文件列表B来跟踪我已处理的所有文件,以及文件列表A中的第一个文件不在文件列表B中的处理。
有更好的方法吗?这种方法是否有效?感谢
编辑:强制性"我是bash newb"
答案 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