2017-11-18 58 views
1

我有一個服務「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 **。 –

回答

0

最明顯的方法是使用繁忙的循環。但如果你是在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 {.} 
相關問題