列出具有相应“就绪”文件的文件

列出具有相应“就绪”文件的文件

问题描述:

我有一个服务“A”,它生成一些包含它在请求中接收的数据的压缩文件。并行地有另一个服务“B”使用这些压缩文件。列出具有相应“就绪”文件的文件

诀窍是“B”不应该消耗任何文件,除非它们完全写入。该服务通过查找由服务“A”创建的“.ready”文件来推导该信息,其名称与所提及的扩展名一起生成的文件完全相同;一旦压缩完成。服务“B”使用Apache Camel来执行此过滤。

现在,我正在编写一个需要相同压缩文件的shell脚本,这需要在shell中实现相同的过滤。我需要编写这个脚本的帮助。我知道找到命令,但一个天真的shell用户,所以知识非常有限。

例子:

压缩文件:sumit_20171118_1.gz

相应的准备 文件:sumit_20171118_1.gz.ready

另一个压缩文件:sumit_20171118_2.gz

没有现成的文件这个是存在的。

在上面列出的文件中,只有第一个应该被选中,因为它有一个相应的准备文件。

+2

你为什么不只是遍历所有'* .ready'文件,然后切断'.ready'后缀? – melpomene

+0

是的,当然是一种选择。我只是想知道是否存在这样做的一些命令/内置功能。或者一般来说,如果有一个标准的方法来处理这种情况。 –

+1

如果**服务B **正在寻找压缩文件,它通常的工作方式是**服务A **用类似'.inprogress'的扩展名写入文件,当文件完全写入时**服务A **将其名称更改为以'.gz'结尾 - 从而以原子方式将完整文件释放到**服务B **。 –

最明显的方法是使用繁忙的循环。但如果你是在GNU/Linux,你可以做的比这更好的(来自:https://www.gnu.org/software/parallel/man.html#EXAMPLE:-GNU-Parallel-as-dir-processor

inotifywait -qmre MOVED_TO -e CLOSE_WRITE --format %w%f my_dir | 
    parallel -uj1 echo Do stuff to file {} 

这种方式,你甚至不必等待。就绪文件:在写入时,命令将只运行文件完成并且文件关闭。

但是,如果该文件。就绪只写很久以后,你可以搜索一个:

inotifywait -qmre MOVED_TO -e CLOSE_WRITE --format %w%f my_dir | 
    grep --line-buffered '\.ready$' | 
    parallel -uj1 echo Do stuff to file {.}