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

时间:2016-07-04 13:56:34

标签: bash file directory pipeline bag

在Linux shell中,我想将文件夹视为一包文件。有一些过程将文件放入此包中。在以下两种状态之一中只有一个进程:

  1. 处理文档,然后将其删除
  2. 等待文件夹中存在任意文档,然后对其进行处理
  3. 处理文件的顺序或名称是什么并不重要。

    从文件夹中获取文件的独特进程看起来像什么?处理意味着使用文件名作为参数调用另一个程序。

    请注意,在我手动执行此操作之前,此独特流程不会终止。

4 个答案:

答案 0 :(得分:2)

您可以使用incrond,它代表“inotify cron daemon”。它是一个守护程序,它在后台运行并监视表中指定的目录。 可以使用

创建有效配置
incrontab -e

这将打开一个编辑器,您可以键入要观看的目录和操作,例如,

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

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

您必须通过告知哪些用户可以使用该服务来初始化incrond。您可以允许用户通过将其添加到incrond.allow来使用incrond,例如,

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

请注意,root也必须位于incrond.allow。 现在,您只需调用

即可启动守护程序
incrond

有关incrond的更多信息:

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

这个怎么样:

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来写入文件的进程来做到这一点。但是,我不确定如何解决同一个程序的多次执行问题......