如何在Linux中将新文件添加到目录时执行任务

在Ubuntu PC概念上的Bash shellFatmawati Achmad Zaenuri / Shutterstock.com

本教程将向您展示如何使用Linux文件系统事件(通知)在每次文件出现在目录中时收到通知。您可以将这些用作触发器来自动执行系统上的常见任务。

我们将编写一个脚本来监视目录并对添加的新文件进行操作。一旦检测到,每个文件都被gzip压缩并移动到另一个目录。该脚本通过名为inotify-tools的实用程序使用inotify子系统。但首先,让我们安装工具和实验。

安装inotify-tools和gzip

使用 apt-get的 如果您使用的是Ubuntu或其他基于Debian的发行版,请将此软件包安装到您的系统上。在其他Linux发行版上,请使用Linux发行版的包管理工具。

sudo apt-get install inotify-tools gzip

尝试使用inotify-tools

让我们首先看一个目录,看看新文件到达时发生的事件。我们将使用一个名为的工具 inotifywatch ,这是inotify-tools的一部分。创建一个名为“incoming”的新目录:

mkdir传入

通过执行以下命令开始查看此目录:

inotifywatch -v传入

这将指示inotify监视“incoming”目录中的所有文件系统事件。该 -v 选项使工具打印出有关其正在执行的操作的额外信息。我们还没有指定超时选项 (-t ),该命令将继续收集事件,直到我们用CTRL + C退出。此时,我们的终端应该看起来像这样:

如何在Linux中将新文件添加到目录时执行任务 1

打开一个新的终端窗口(或选项卡)并切换到传入目录。使用touch命令创建名为“newfile”的新文件。

cd传入/
触摸新文件

现在回到第一个终端窗口,按CTRL + C停止inotifywatch。

如何在Linux中将新文件添加到目录时执行任务 2

将向控制台提供一个事件表,指示“create”,“open”,“attrib”和“close_write”的一个实例。当我们使用touch创建新文件,设置其文件访问权限时,会发生这四个事件属性,打开它来写一个空终止字符,然后关闭它。这些只是可以使用inotify-tools在文件系统上监视的众多事件中的一小部分。您可以在主页面上看到inotifywatch的完整列表。

出于我们的目的,我们只对两个事件感兴趣:

  • “create” – 在目标目录中创建文件时。
  • “moved_to” – 当文件从另一个位置移动到目标目录时。

让我们再次尝试inotifywatch,但这次只是指示它监视这两个事件。在第一个终端窗口中运行此命令:

inotifywatch -v -e create -e moved_to incoming

在第二个终端窗口或选项卡中,让我们尝试创建一个新文件,更改其内容,然后将文件从另一个位置移动到目标目录。所有这些命令都从主目录运行。

触摸传入/创建
echo Testing123 >>传入/创建
touch / tmp / created2
mv / tmp / created2传入/

返回第一个终端窗口,按CTRL + C停止inotifywatch。我们将看到以下输出:

如何在Linux中将新文件添加到目录时执行任务 3

只计算了两个事件:创建一个名为“created.txt”的文件并移动一个名为“created2.txt”的现有文件。其他所有内容,例如修改“created.txt”,都被忽略了。

查看目录并执行任务

现在我们知道要遵循哪些事件,我们可以使用另一个名为的工具 inotifywait 阻止执行,直到在目标目录中创建或移动文件。我们将使用与inotifywatch相同的参数,并指定我们希望如何格式化文件名以用于我们的任务。

在开始之前,我们需要一个目录来保存已经处理过的文件。创建一个名为“processed”的目录:

mkdir处理完毕

接下来,创建一个名为“watch-incoming.sh”的新脚本,并添加下面列出的内容:

#!/斌/庆典

TARGET =〜/呼入/
PROCESSED =〜/处理/

inotifywait -m -e create -e moved_to –format“%f”$ TARGET
        |同时阅读FILENAME
                做
                        echo检测到$ FILENAME,移动和压缩
                        mv“$ TARGET / $ FILENAME”“$ PROCESSED / $ FILENAME”
                        gzip“$ PROCESSED / $ FILENAME”
                DONE

该脚本执行 inotifywait 命令与 -m 选项。这使命令监视器无限期地更改。每次检测到新事件时,文件名都会传递给read命令并注入“FILENAME”变量。执行while循环下的块,首先将文件移动到“已处理”目录然后进行gzip压缩。原始文件将替换为压缩文件,文件名将以“.gz”结尾。

让我们为此脚本授予执行权限,并从我们的主目录运行它。

chmod u + x watch-incoming.sh
./watch-incoming.sh

打开第二个终端窗口并在“incoming”目录中创建一个新文件。列出“incoming”和“processed”目录的内容,以查看被检测事件的结果:

如何在Linux中将新文件添加到目录时执行任务 4

我们复制到“传入”目录中的原始文本文件被脚本检测到,复制到“已处理”,然后使用gzip压缩。

我们现在可以做一些有趣的任务,因为我们能够监视到达目录的新文件。例如,我们可以为图像文件添加水印,将原始视频压缩为mp4格式,甚至将我们看到的每个新文件上传到Amazon S3存储桶。此脚本是滚动自己的工作流程并自动执行系统上的常见任务的良好起点。

本文机器自动生成,不保证语句完整通顺和表达准确,亦不对内容真实有效性负责,请读者知悉。