Shell
處理目錄中出現的文件
可能重複:
我正在嘗試編寫一個簡單的 etl 程序,它會每分鐘在目錄中查找文件,如果是,則將它們載入到遠端系統(通過腳本)然後刪除它們。
使事情複雜化的事情:載入可能需要一分鐘以上。為了解決這個問題,我想我可以將所有文件移動到一個臨時處理目錄中,在那裡對它們進行操作,然後從那裡刪除它們。此外,為了更好地編寫命令行腳本,我正在嘗試一個更優雅的解決方案。我首先編寫了一個簡單的腳本來完成我的任務,如下所示:
#!/bin/bash for i in ${find /home/me/input_files/ -name "*.xml"}; do FILE=$i; done; BASENAME=`basename $FILE` mv $FILE /tmp/processing/$BASENAME myscript.sh /tmp/processing/$BASENAME other_inputs rm /tmp/processing/$BASENAME
該腳本幾乎立即從處理目錄中刪除文件(這停止了重複處理問題),最後自行清理,並允許在兩者之間處理文件。
然而,這畢竟是 U/Linux。我覺得我應該能夠通過管道和移動東西而不是龐大的腳本來維護,從而在一行中完成所有這些。
此外,使用並行到並發程序這將是一個加號。
附錄:某種 FIFO 隊列也可能是這個問題的答案。或者可能是某種其他類型的目錄觀察程序而不是 cron。我願意接受所有比我的小腳本更優雅的建議。唯一的問題是“輸入目錄”中的文件在實際寫入之前被觸摸,所以某種!-size -0 只需要處理真實文件。
聽起來好像您只需編寫一個小型處理腳本並使用 GNU Parallel 進行並行處理:
http://www.gnu.org/software/parallel/man.html#example__gnu_parallel_as_dir_processor
所以是這樣的:
inotifywait -q -m -r -e CLOSE_WRITE --format %w%f my_dir | parallel 'mv {} /tmp/processing/{/};myscript.sh /tmp/processing/{/} other_inputs; rm /tmp/processing/{/}'
觀看介紹影片以了解更多資訊:http: //pi.dk/1
編輯:
要求 myscript.sh 可以處理長度為 0 的文件(例如忽略它們)。
如果你能避免,
touch
你甚至可以這樣做:inotifywait -q -m -r -e CLOSE_WRITE --format %w%f my_dir | parallel myscript.sh {} other_inputs
安裝 GNU Parallel 非常簡單:
wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel chmod 755 parallel