每个人都有自己的隐私
尤其是数字信息时代更是如此
小到自己写下的情书
大到公司商业机密
抑或是偷偷下载的日本XXX.avi
这些隐私
放桌面——找死
放某个隐秘目录——麻烦
放垃圾筒……谁会这么干
真想有个工具
自动帮我压缩
自动帮我放到安全位置
嗯……
良许今天就带你实现这个过程
1. 工具安装
要实现上述那个不为人知的过程,我们需要安装两个工具:inotify-tools 和 gzip 。
如果你使用的是 Ubuntu 或者其它基于 Debian 的发行版,那么可以使用 apt-get 命令安装以上两个工具。在其他 Linux 发行版上,则需要使用对应的包管理工具。
$ sudo apt-get install inotify-tools gzip
2. inotify-tools 使用详解
顾名思义,inotify-tools
是包含了很多工具的工具集。我们首先来测试一下,如果一个目录里有新文件创建时,会捕捉到什么事件。这里我们将使用到一个名为 inotifywatchinotify-tools
的工具。
我们先在任意位置创建一个名为 incoming 的新目录:
$ mkdir incoming
然后再执行以下命令开始监测此目录:
$ inotifywatch -v incoming
这个命令将使用 inotify 工具来监视 incoming 目录中的所有文件系统事件。我们使用这个工具的目的就是来监测在目标目录下创建新文件时会有什么事件产生。
在这里,-v
选项打印工具的输出信息。同时,它还有超时选项 -t
,但在这里我们未指定,所以它将持续收集事件,直到我们按 Ctrl + C
才会退出。
命令运行之后终端将会打印以下信息:
接下来,打开一个新的终端窗口并切换到刚刚建立的 incoming 目录。然后再使用 touch 命令创建名为 newfile 的新文件。
$ cd incoming/
$ touch newfile
现在我们再回到第一个终端窗口,按下 CTRL+C 停止 inotifywatch 命令。我们将得到以下信息:
在结果信息里,我们可以看到 inotifywatch 捕获到 4 个事件,包括:属性、创建、打开、写入并关闭。这 4 个事件都是由 touch newfile
这个命令产生的。
当然,这几个事件都只是 inotifywatch 所能捕获的众多事件的一小部分,更多事件我们可以在它的主页上查看。
但是,很多情况下我们并不需要太多事件。假如我们只对下面两个事件感兴趣:
- create :在目标目录中创建文件时
- moved_to :当文件从另一个位置移动到目标目录时
我们再来使用 inotifywatch 工具,但是这次只让它监视这两个事件。我们可以使用以下命令来达到这个目的:
$ inotifywatch -v -e create -e moved_to incoming
然后再切换到第二个终端窗口中,我们创建一个新的文件,再更改它的内容。
再之后,我们在 /tmp 目录下随便再创建个文件,再将它移动到目标目录。整个过程如以下命令所示:
$ touch incoming/created
$ echo Testing123 >> incoming/created
$ touch /tmp/created2
$ mv /tmp/created2 incoming/
接着我们再返回第一个终端窗口,按下 CTRL + C 停止 inotifywatch 。我们将看到以下输出:
从以上结果我们可以看出,inotifywatch 只捕获了两个事件:create 及 moved_to 。而对于其它事件,比如修改文件内容,则全部被忽略。
正是利用了 inotifywatch 的这个可以捕获事件的特性,我们可以实现当一个目录里有新文件移入的时候,将其压缩并放置到其它地方的目的。这样我们就能实现将自己的私密文件丢到那个目录,自动压缩并存放到安全位置。当然,充分利用这些特性,我们可以实现更多好玩的功能。
3. 监测目录并执行脚本
现在,我们来一步步实现上面所提到的需求。这里我们使用到另外一个工具:inotifywait
,它的参数及使用方法与 inotifywatch
类似,当目录里创建了新文件或移入了其它位置的文件,它将执行我们所指定的脚本。
我们首先创建一个名为 processed 的目录,用来保存已经处理过的文件。
$ 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
这个脚本里 inotifywait 使用了 -m
选项,表示监测到指定事件时执行后续的命令。在这条命令里, inotifywait 只监测 create 和 moved_to 事件。当这两个事件发生时,文件名都会传递给 read 命令并赋值给 FILENAME 变量,然后再执行while循环下的代码块:首先将文件移动到刚刚创建的 processed 目录,然后再进行 gzip 压缩。
我们为该脚本赋予可执行权限,然后从主目录运行这个脚本。
$ chmod u+x watch-incoming.sh
$ ./watch-incoming.sh
现在打开第二个终端窗口并在 incoming 目录中创建一个新的文件。然后再列出 incoming 和 processed 目录的内容,看看操作结束之后的结果。
脚本检测到我们在 incoming 目录下有新文件创建,将其复制到 processed 目录中,然后使用 gzip 进行压缩。
这个功能实现后,我们还可以 DIY 更多好玩的功能。例如,我们可以为图像文件添加水印,将原始视频压缩为mp4格式,批量修改文件名,等等。不怕不实现,就怕脑门不够大!
-----------------
我是良许,世界500强外企 Linux 开发工程师,专业生产 Linux 干货。欢迎关注我的公众号「良许Linux」,回复「1024」获取最新最全的技术资料,回复「入群」进入高手如云技术交流群。