打开新的终端窗口(或选项卡)并切换到传入目录。使用touch命令创建名为“newfile”的新文件。
cd incoming/
touch newfile
现在返回到第一个终端窗口,按CTRL+C停止inotifywatch。
将向控制台提供一个事件表,指示“create”、“open”、“attrib”和“CLOSE_WRITE”的一个实例。这四个事件发生在我们使用Touch创建一个新文件、设置其文件访问属性、打开它以写入空的终止字符,然后关闭它的时候。这些只是可以使用inotify工具在文件系统上监视的众多事件中的一小部分。你可以在inotifywatch的主页上看到完整的名单。
出于我们的目的,我们只对两个事件感兴趣:
“创建”-在目标目录中创建文件时。 “Moved_To”-当文件从另一个位置移动到目标目录时。
让我们再次尝试inotifywatch,但这一次指示它只监视这两个事件。在第一个终端窗口中运行此命令:
inotifywatch -v -e create -e moved_to incoming
在第二个终端窗口或选项卡中,让我们尝试创建一个新文件,更改其内容,然后将该文件从另一个位置移动到目标目录。所有这些命令都是从主目录运行的。
touch incoming/created
echo Testing123 >> incoming/created
touch /tmp/created2
mv /tmp/created2 incoming/
返回到第一个终端窗口,按CTRL+C停止inotifywatch。我们将看到以下输出:
只统计了两个事件:创建名为“created.txt”的文件和移动名为“created2.txt”的现有文件。其他所有内容都被忽略,比如修改“created.txt”。
监视目录和执行任务
现在我们知道了接下来会发生什么事件,我们可以使用另一个名为ninotifyWait的工具来阻止执行,直到在目标目录中创建文件或将其移动到目标目录为止。我们将使用与inotifywatch相同的参数,并指定如何格式化文件名以便在任务中使用。
在开始之前,我们需要一个目录来保存已经处理过的文件。创建名为“已处理”的目录:
mkdir processed
接下来,创建一个名为“watch-incoming.sh”的新脚本,并添加下面列出的内容:
#!/bin/bash
TARGET=~/incoming/
PROCESSED=~/processed/
inotifywait -m -e create -e moved_to --format "%f" $TARGET \
| while read FILENAME
do
echo Detected $FILENAME, moving and zipping
mv "$TARGET/$FILENAME" "$PROCESSED/$FILENAME"
gzip "$PROCESSED/$FILENAME"
done
该脚本通过带有-m选项的TinotifyWait命令执行。这会使命令监视器无限期更改。每次检测到新事件时,都会将文件名传递给读取命令并注入到“filename”变量中。执行WHILE循环下的块,在该块中,首先将文件移动到“已处理”目录,然后对其进行gzip压缩。原始文件将替换为压缩文件,文件名将以“.gz”结尾。
让我们授予对此脚本的EXECUTE权限,并从我们的主目录运行它。
chmod u+x watch-incoming.sh
./watch-incoming.sh
打开第二个终端窗口,并在“传入”目录中创建一个新文件。列出“传入”和“已处理”目录的内容,以查看检测到的事件的结果:
脚本检测到我们复制到“传入”目录的原始文本文件,将其复制到“已处理”目录,然后使用gzip进行压缩。
现在我们可以执行一些有趣的任务,因为我们能够监视到达目录的新文件。例如,我们可以为图像文件添加水印,将原始视频压缩为MP4格式,甚至将我们看到的每个新文件都上传到Amazon S3存储桶中。此脚本是在系统上滚动您自己的工作流和自动执行常见任务的良好起点。