2016-07-04 76 views
2

在Linux shell中,我想將文件夾視爲一大堆文件。有一些將文件放入此包的進程。恰好有一個過程,是在以下兩個狀態中的任一個:bash - 從文件夾中選取文件,進程,刪除

  1. 處理文檔,然後將其刪除
  2. 等待的文件夾中存在的任意文檔,然後對其進行處理

文件處理順序或名稱的順序無關緊要。

從bash文件夾中獲取文件的獨特過程會是什麼樣子?處理意味着以文件名作爲參數調用另一個程序。

請注意,這個獨特的過程將不會終止,直到我手動這樣做。

+0

我只能想一個解決方案有外部文件保存狀態,否則,如果你有2個進程運行在相同的文件夾中,您將處理相同的文件兩次,或在處理其他線程時將其刪除。 – Yaron

+0

不,只有一個進程取出文件。有多個放置文件,但只有一個進程從文件夾中刪除。 –

回答

0

如何:

while true; do 
    files=($(ls)); 
    if [[ ${#files[@]} -eq 0 || (`lsof -c write_process -- ${files[0]}`)]]; then 
     sleep 5; 
    else 
     process ${files[0]}; 
     rm ${files[0]}; 
    fi; 
done 

...或者這個(可能是不健康的):

while true; do 
    files=($(ls)); 
    if [ ${#files[@]} -ne 0 && ! (`lsof -c write_process -- ${files[0]}`)]; then 
     process ${files[0]}; 
     rm ${files[0]}; 
    fi; 
done 

哪裏,正如指出的那樣,我必須確保該文件完全寫入到文件夾中。我通過檢查寫入文件的進程的lsof來做到這一點。然而,我不知道如何解決一個進程的同一程序的多個執行...

+0

這個工程。只要確保它不總是/經常是按字母順序添加的第一個文件(否則只要write_processes正在運行,$ {files [0]}將始終/經常打開)。 –

0

最簡單的方法可能是在文件只是循環,「呼叫」的處理程序,並刪除文件:

for f in /path/to/folder/*; do 
    program_that_processes_file $f 
    rm $f 
done 

沒有與此雖然是小問題:如果程序創建的文件不會自動完成,你可以處理甚至刪除尚未完全寫入的文件。最簡單的解決方案是讓作者寫入一個臨時目錄,然後當文件全部完成時,將其移至最終的目標目錄。

+0

只要沒有文件存在,它會不會終止?什麼意思是關閉for循環? –

+1

@RadioControlled然後在另一個循環中有循環。或者可能使用每隔幾秒調用一次的cron腳本。或者在目錄中有文件時使用一個目錄監視程序(有幾個這樣的程序)來調用這個腳本。 –

+0

哦,我剛剛意識到'od'正在關閉'do'...我總是用'done' –

1

inotify-tools將是獲取目錄更改的即時通知的理想工具。一旦您收到新文件創建的通知,您就可以處理並刪除它。

+0

這會很複雜,因爲在我處理一個文件時可能會創建多個文件。所以我將不得不建立一堆添加的文件。這當然是可能的,但我認爲可能有一個更簡單的解決方案,因爲放入文件夾中的文件順序無關緊要。 –

+0

請閱讀https://techarena51.com/index.php/inotify-tools-example/。他們舉例說明了如何創建一個腳本並傳遞給inotifywait(在你的情況下是'create'事件)。 – Fazlin

+1

'inotify'將爲目錄內的每個文件創建創建通知,並且爲每個收到的通知創建通知,您可以執行任何想要的處理。據我所知,這是最乾淨的解決方案。當然會很高興被證明是錯誤的! – Fazlin

2

您可以使用incrond,它代表「inotify cron daemon」。它是一個在後臺運行並監視表中指定的目錄的守護進程。 有效的配置可以用

incrontab -e 

這將打開一個編輯器,你可以輸入你想觀看的目錄和動作,例如創建,

/path/to/observed/directory IN_CREATE,IN_MOVED_TO <command> [email protected]/$# 

<command>是命令或腳本如果其中一個事件(IN_CREATE,IN_MOVED_TO)被觸發,則要執行該操作。 [email protected]/$#是創建或移動到監視文件夾的文件的路徑,並將傳遞到<command>。基本上,您只需開始觀看文件夾即可。

您將不得不初始化incrond一次,告訴它哪些用戶可以使用該服務。您可以允許用戶通過將其添加到incrond.allow,例如使用incrond,

echo 'root' >> /etc/incrond.allow 
echo '<username>' >> /etc/incrond.allow 

通知,即root也必須incrond.allow。 現在,你可以通過簡單地調用

incrond 

更多信息incrond啓動守護程序: