从文件夹中选择文件,处理,删除



在Linux shell中,我希望将一个文件夹视为一个文件包。有一些程序将文件放入这个包中。只有一个进程处于以下两种状态之一:

  1. 处理一个文档,然后删除它
  2. 等待文件夹中存在任意文档,然后处理它

文档的处理顺序和名称都不重要。

在bash中从文件夹中取出文件的唯一进程是什么样子的?处理意味着以文件名作为参数调用另一个程序。

您可以使用incrond,它代表"inotify cron daemon"。它是在后台运行的守护进程,监视表中指定的目录。可以使用

创建有效的配置
incrontab -e

这将打开一个编辑器,你可以输入你想要查看的目录和操作,例如

/path/to/observed/directory IN_CREATE,IN_MOVED_TO <command> $@/$#

<command>是在触发其中一个事件(IN_CREATE,IN_MOVED_TO)时要执行的命令或脚本。$@/$#是创建或移动到监视文件夹的文件的路径,并将传递给<command>。这基本上就是你开始监视文件夹所需要做的。

你必须初始化一次incond,告诉它哪些用户可以使用该服务。您可以允许用户通过将它们添加到incrond.allow来使用增加,例如

echo 'root' >> /etc/incrond.allow
echo '<username>' >> /etc/incrond.allow

注意,root也必须在incrond.allow中。现在您可以通过简单地调用

来启动守护进程
incrond

incrond的更多信息:

  • incrond
  • incrontab

inotify-tools将是获取目录更改的即时通知的理想工具。一旦您收到新文件创建的通知,您就可以处理它并删除它。

最简单的方法可能是循环遍历文件,"调用"处理程序并删除文件:

for f in /path/to/folder/*; do
    program_that_processes_file $f
    rm $f
done

这里有一个小问题:如果创建文件的程序没有自动执行,您可以处理甚至删除尚未完全写入的文件。最简单的解决方案是让写入器写入临时目录,然后当文件全部完成时,将其移动到最终目标目录。

这个怎么样:

while true; do
    files=( $(ls) );
    if [[ ${#files[@]} -eq 0 || (`lsof -c write_process -- ${files[0]}`)]]; then
        sleep 5;
    else
        process ${files[0]};
        rm ${files[0]};
    fi;
done

…或者这个(可能不健康):

while true; do
    files=( $(ls) );
    if [ ${#files[@]} -ne 0 && ! (`lsof -c write_process -- ${files[0]}`)]; then
        process ${files[0]};
        rm ${files[0]};
    fi;
done

如前所述,我必须确保文件完全写入文件夹。我通过在lsof上检查写文件的进程来做到这一点。然而,我还不确定如何解决同一程序的多次执行作为一个进程…

相关内容

  • 没有找到相关文章

最新更新