我有一个服务“A”,它生成一些压缩文件,包括它在请求中接收的数据。并行地存在另一个服务“B”,其使用这些压缩文件。
诀窍是“B”不应该使用任何文件,除非它们完全写入。该服务通过查找由服务“A”创建的“.ready”文件来推断该信息,该文件的名称与所提及的扩展名一起生成的文件完全相同;一旦压缩完成。服务“B”使用Apache Camel进行此过滤。
现在,我正在编写一个需要相同压缩文件的shell脚本,这需要在shell中实现相同的过滤。我需要帮助编写这个脚本。我知道find命令但是一个天真的shell用户,因此知识非常有限。
例:
压缩文件:sumit_20171118_1.gz
对应的准备文件:sumit_20171118_1.gz.ready
另一个压缩文件:sumit_20171118_2.gz
这个没有现成的文件。
在上面列出的文件中,只有第一个应该被选中,因为它有一个相应的就绪文件。
最明显的方法是使用繁忙的循环。但如果你使用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 {}
这样您甚至不必等待.ready文件:只有在写入文件完成且文件关闭时才会运行该命令。
但是,如果.ready文件只写得很晚,那么你可以搜索那个:
inotifywait -qmre MOVED_TO -e CLOSE_WRITE --format %w%f my_dir |
grep --line-buffered '\.ready$' |
parallel -uj1 echo Do stuff to file {.}