2016-03-05 218 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