Shell

處理目錄中出現的文件

  • August 26, 2018

可能重複:

更新目錄內容時如何執行命令?

我正在嘗試編寫一個簡單的 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

引用自:https://unix.stackexchange.com/questions/33030