2016-03-05 26 views
1

我想編寫一個腳本,當文件被更改(意思是內容更改或文件被相同名稱的文件覆蓋)時觸發某些代碼在特定的目錄中(或在子目錄中)。當我運行我的代碼並更改一個文件時,它似乎每次運行兩次,因爲我得到了兩次回顯輸出。有什麼我失蹤?inotifywait不能正常工作

while true; do 
    change=$(inotifywait -e close_write /home/bla) 
    change=${change#/home/bla/ * } 
    echo "$change" 
done 

而且當我在指定目錄的子目錄改變的東西它不會做任何事情。

的outpoot看起來像這樣之後我改變在指定目錄下的文件:

Setting up watches. 
Watches established. 
filename 
Setting up watches. 
Watches established. 
filename 
Setting up watches. 
Watches established. 

回答

1

我無法重現該腳本輸出的消息兩次。你確定你沒有運行兩次(在後臺)嗎?還是你使用編輯器來更改文件?文件打開時,某些編輯器會在編輯的文件旁邊放置備份文件。這可以解釋你看到兩條消息。

對於遞歸目錄,您需要將選項-r傳遞給inotifywait。然而,你不應該在超大文件系統樹上運行它,因爲inotify手錶的數量是有限的。您可以通過

cat /proc/sys/fs/inotify/max_user_watches 
+0

獲得您系統的電流限制。我不認爲我正在運行它兩次。我將輸出添加到我的第一篇文章中 - 它看起來會執行兩次,但我只是更改了目錄中文件的內容並保存了文件。 – craaaft

+0

你如何改變文件?與編輯? – hek2mgl

+0

我也剛剛添加了moved_to選項。當我覆蓋它只運行一次,這是所需的。問題在於當我改變文件的內容時。 – craaaft