如何使用inotifywait来监视文件夹而不是文件夹

时间:2017-11-10 14:29:42

标签: bash ubuntu monitoring inotify inotifywait

我想使用inotifyway来监控文件夹中新创建或移动的文件但只监控文件。

我们说我的文件夹是名字" watched_folder_test"我有一个文件名" toto.txt"。如果我使用mv命令将文件移动到watched_folder_test,我收到了我想要的通知

让我们在watched_folder_test中说我有一个名为foo的文件夹,我创建了一个文件名' bar.txt"。我收到了我想要的通知。

但这是我的问题。如果我有一个文件夹名称foo在watched_folder_test之外 我在里面有一个文件名bar.txt(foo / bar.txt),我把整个文件夹移到了watched_folder_test里面。我只收到创建foo的通知!关于bar.txt什么都没有。但是,我并不真正关心foo,我只想了解" bar.txt"

这是我到目前为止的代码

#!/bin/bash                                                                                          

inotifywait -mr /home/romain/depot/watched_folder_test -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        for ac in $action
        do
            isdir=`echo $ac | grep 'ISDIR'`
            if [ $? == 0 ]
            then
                echo "It's a folder"
            else
                echo "It's a file"
            fi
        done
    done

如何获取有关新移动文件夹中的每个文件的通知,而不是创建文件夹本身?

1 个答案:

答案 0 :(得分:3)

我不是inotifytools的粉丝,其中包括inotifywait。我会建议用户在使用它时要特别小心,因为在移动(从和到目录)目录上进行递归监视是完全错误的。

为了解释我的观点,让我们考虑一下你目前的相关情况; dir移动。说,我们正在观看/ foo / bar:

mv /foo/bar /choo/tar上,即使搬出(重命名?)/foo/bar/choo/tar,它仍会错误地将/choo/tar上的事件报告为/foo/bar。这是无法接受的!它不应该继续观看从根观察路径移出的目录。而且,更糟糕的是,它继续用一条不存在的陈旧路径报告它。

此外,为什么move事件报告为create?岂有此理! movecreate完全不同! movemove,必须报告为move。令人遗憾的是inotifytools非常受欢迎,毫无疑问的用户并不知道其谬误。

现在我已经解除了挫折感(尽管这很重要),让我们帮助解决你的情况。

运行fluffy :终端:1

root@six-k:/home/lab/fluffy# fluffy | \
while read events path; do \
 if ! echo $events | grep -qie "ISDIR"; then \
  echo "$events $path"; \
 fi
done

重现您的情况:终端:2

root@six-k:/tmp# pwd
/tmp
root@six-k:/tmp# mkdir test
root@six-k:/tmp/test# ls -l
total 0
root@six-k:/tmp/test# mkdir -p d1/dd1
root@six-k:/tmp/test# echo "This file will be moved" | cat >> d1/dd1/f1
root@six-k:/tmp/test# mkdir -p d2/
root@six-k:/tmp/test# ls -l d2
total 0
root@six-k:/tmp/test# fluffyctl -w ./d2

root@six-k:/tmp/test# mv d1 d2/
root@six-k:/tmp/test# ls -lR d1
ls: cannot access d1: No such file or directory
root@six-k:/tmp/test# ls -lR d2
d2:
total 4
drwxr-xr-x 3 root root 4096 Mar 18 20:03 d1

d2/d1:
total 4
drwxr-xr-x 2 root root 4096 Mar 18 20:04 dd1

d2/d1/dd1:
total 4
-rw-r--r-- 1 root root 24 Mar 18 20:04 f1

root@six-k:/tmp/test# echo "Events will be produced on this moved file" | cat >> d2/d1/dd1/f1
root@six-k:/tmp/test# cat d2/d1/dd1/f1
This file will be moved
Events will be produced on this moved file
root@six-k:/tmp/test# echo "New files are also watched in the moved dir" | cat >> d2/d1/dd1/f2
root@six-k:/tmp/test# cat d2/d1/dd1/f2
New files are also watched in the moved dir
root@six-k:/tmp/test# fluffyctl -I d2
root@six-k:/tmp/test# fluffy exit

事件日志:终端:1

root@six-k:/home/lab/fluffy# fluffy | \
> while read events path; do \
>  if ! echo $events | grep -qie "ISDIR"; then \
>   echo "$events $path"; \
>  fi
> done

OPEN, /tmp/test/d2/d1/dd1/f1
MODIFY, /tmp/test/d2/d1/dd1/f1
CLOSE_WRITE, /tmp/test/d2/d1/dd1/f1
OPEN, /tmp/test/d2/d1/dd1/f1
ACCESS, /tmp/test/d2/d1/dd1/f1
CLOSE_NOWRITE, /tmp/test/d2/d1/dd1/f1
CREATE, /tmp/test/d2/d1/dd1/f2
OPEN, /tmp/test/d2/d1/dd1/f2
MODIFY, /tmp/test/d2/d1/dd1/f2
CLOSE_WRITE, /tmp/test/d2/d1/dd1/f2
OPEN, /tmp/test/d2/d1/dd1/f2
ACCESS, /tmp/test/d2/d1/dd1/f2
CLOSE_NOWRITE, /tmp/test/d2/d1/dd1/f2
IGNORED,ROOT_IGNORED,WATCH_EMPTY, /tmp/test/d2
IGNORED, /tmp/test/d2/d1
root@six-k:/home/lab/fluffy# 

与inotifytools不同,fluffy 忠实地报告事件!

我希望这个例子足以让你为你的用例加强它。干杯!