在linux中,当一个新文件被添加到一个目录时,如何执行一个任务

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

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

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

安装inotify工具和gzip

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

sudo apt-get install inotify-tools gzip

使用inotify工具进行试验

让我们先观察一个目录,看看新文件到达时会发生什么事件。我们将使用一个名为inotifywatch的工具,它是inotify工具的一部分。创建一个名为“incoming”的新目录:

mkdir incoming

通过执行以下命令开始监视此目录:

inotifywatch -v incoming

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

在linux中,当一个新文件被添加到一个目录时,如何执行一个任务

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

cd incoming/ touch newfile

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

在linux中,当一个新文件被添加到一个目录时,如何执行一个任务

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

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

  • “create”–在目标目录中创建文件时。
  • “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。我们将看到以下输出:

在linux中,当一个新文件被添加到一个目录时,如何执行一个任务

只统计了两个事件:创建一个名为已创建.txt并移动一个名为“created2.txt”的现有文件。其他一切,如修改“已创建.txt,”被忽略。

监视目录并执行任务

现在我们知道了接下来要发生什么事件,我们可以使用另一个名为inotifywait的工具来阻止执行,直到在目标目录中创建文件或将其移动到目标目录为止。我们将使用与inotifywatch相同的参数,并指定在任务中如何格式化文件名。

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

mkdir processed

接下来,创建一个名为“watch”的新脚本-传入.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选项执行inotifywait命令。这使得命令监视器无限期地改变。每次检测到新事件时,文件名都会传递给read命令并注入到“filename”变量中。执行while循环下的块,其中文件首先移动到“processed”目录,然后gzip。原始文件将替换为压缩文件,文件名将以“.gz”结尾。

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

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

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

在linux中,当一个新文件被添加到一个目录时,如何执行一个任务

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

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

  • 发表于 2021-04-03 18:12
  • 阅读 ( 232 )
  • 分类:互联网

你可能感兴趣的文章

如何在linux中添加用户

... 像Ubuntu这样的发行版已经创建了一个新的命令adduser,它通过一个符号链接与默认的useradd命令相连接。符号链接是存储系统中任何其他文件的引用的文件。 ...

  • 发布于 2021-03-26 23:29
  • 阅读 ( 334 )

如何使用受限shell来限制linux用户可以做什么

...如何在Linux上设置受限shell。 受限炮弹 受限shell不是另一个shell。这是标准外壳的另一种模式。Bash、Korn、Fish和其他shell都可以在受限shell模式下启动。在本文中,我们将使用Bash,但相同的原则也适用于其他shell。 因为受限shell...

  • 发布于 2021-03-31 10:57
  • 阅读 ( 387 )

如何在linux上使用sqlite数据库浏览器

...使用SQLite GUI。 sqlite数据库项目 SQLite数据库库和工具是一个非常成功的开源结构化查询语言(SQL)数据库项目。如此成功,事实上,它可以称自己为世界上部署最广泛的数据库引擎。 自2000年首次发布以来,SQLite已经看到了绝...

  • 发布于 2021-03-31 22:56
  • 阅读 ( 184 )

如何使用shopt定制bashshell

...容再次检查: shopt histverify histverify选项更改history命令的一个方面的操作方式。通常,如果您要求历史通过编号引用命令来重复该命令,例如!245,从命令历史中检索命令并立即执行。 如果希望查看命令以确保它是您期望的命...

  • 发布于 2021-04-01 12:30
  • 阅读 ( 175 )

如何在linux上使用hugo静态站点生成器

...先构建的,可以很快地提供给访问者。 但这并不意味着一个静态网站一定会很无聊。他们可以使用HTML提供的一切,加上层叠样式表(CSS)和JavaScript。他们也可以很容易地像图像旋转木马和网页滑动背景图像。 Hugo网站生成器使...

  • 发布于 2021-04-01 20:08
  • 阅读 ( 182 )

如何在linux上的bash中设置环境变量

...动时保持持久性。 环境与遗传 当shell启动时,它会经历一个初始化阶段。此时,它读取定义shell环境的环境变量。 当程序或命令从称为子进程的shell启动时,它会继承父进程的环境,但请注意!我们将看到,您可以创建不添加到...

  • 发布于 2021-04-02 06:44
  • 阅读 ( 221 )

如何在linux上使用cd命令

...你的注意,因为它们又小又简单。 在使用Linux计算机的第一个小时内,您将学习如何使用Bash和其他shell附带的cd命令。也许您以前有在其他操作系统上使用它的经验,不需要解释。它会改变当前的工作目录,对吗?还有什么要知...

  • 发布于 2021-04-02 08:58
  • 阅读 ( 173 )

如何在linux中向$path添加目录

...的($path on linux, and how does it work)? 当您在终端窗口中键入一个命令并按Enter键时,您甚至在执行命令之前就开始了大量的活动。 Bash是大多数Linux发行版的默认shell。它解释您输入的文本行,并标识与参数、管道、重定向和其他内...

  • 发布于 2021-04-02 14:04
  • 阅读 ( 188 )

如何在linux上使用at和batch来调度命令

如果您想安排一个只发生一次的Linux作业,cron就太过了。at系列的命令是你所需要的!如果只想在系统有空闲资源时运行进程,可以使用批处理。 如何安排linux作业 cron守护进程维护它在特定时间运行的作业列表。这些任务和程...

  • 发布于 2021-04-02 18:33
  • 阅读 ( 186 )

如何在linux上使用echo命令

...奥林匹斯山,与美丽的仙女交往。在一次旅行中,他告诉一个叫埃科的山里仙女,如果他的妻子赫拉跟着他,他就要拦住她。赫拉确实是来找宙斯的,埃科尽她所能让赫拉保持对话。最后,赫拉发了脾气,诅咒可怜的埃科,让她...

  • 发布于 2021-04-03 00:31
  • 阅读 ( 181 )
fflzvs7091
fflzvs7091

0 篇文章

相关推荐