在Linux中,文件发生更改时如何执行命令?

如果你想学习如何在工作目录中的任何文件更改时运行Linux命令,或者在创建新文件时运行命令,那么你来对地方了。

在Linux中,你可以使用来安排在特定时间运行的命令。

但是如果你需要在每次文件被修改或在目录中添加新文件时运行命令怎么办呢?

这也是很容易实现的,有一些命令行工具可以完成这些操作。

让我们开始吧!

watchexec

watchexec是一个方便而独立的工具,它监视给定的工作目录,并在检测到任何更改(如文件更新或新文件创建)时执行命令。

特点

  • 它不需要涉及xargs(扩展参数)的复杂命令行。
  • 实时检查当前目录和所有子目录中的更改。
  • 无需语言运行时,与任何特定的语言或生态系统无关。
  • 默认使用.gitignore.ignore来决定对哪些文件忽略通知。
  • 使用进程组来跟踪分叉程序。
  • 支持监视具有特定扩展名的文件。
  • 兼容OS X、Linux和Windows。
  • 基于glob(用于查找部分相同文件名的文件搜索模式)进行过滤和忽略事件。

安装watchexec

要轻松安装watchexec工具,请将以下链接粘贴到终端或shell提示符中,然后按Enter键。

Linux和macOS

curl -sS https://webinstall.dev/watchexec | bash

安装成功后,路径将显示在屏幕上。在我的情况下,该工具安装在/root/.local/bin中。

┌──(root💀kali)-[~]
└─# curl -sS https://webinstall.dev/watchexec | bash

Thanks for using webi to install 'watchexec@stable' on 'Linux/x86_64'.
Have a problem? Experience a bug? Please let us know:
        https://github.com/webinstall/webi-installers/issues

Lovin' it? Say thanks with a Star on GitHub:
        https://github.com/webinstall/webi-installers

Found /root/Downloads/webi/watchexec/cli-v1.18.9/watchexec-1.18.9-x86_64-unknown-linux-musl.tar.xz
Extracting /root/Downloads/webi/watchexec/cli-v1.18.9/watchexec-1.18.9-x86_64-unknown-linux-musl.tar.xz
Installing to /root/.local/opt/watchexec-vcli-v1.18.9/bin/watchexec
Installed 'watchexec vcli-v1.18.9' as /root/.local/bin/watchexec

安装完成后,导航到.local/bin存储库,并使用以下命令检查文件是否存在。

cd .local/bin

ls

下一步是导出路径以使用watchexec工具。

export PATH="/root/.local/bin:$PATH"

要运行,只需在终端中输入watchexec作为根用户。使用此命令查看可以与watchexec工具一起使用的标志和选项。

watchexec --help

示例命令

  • 在该目录/子目录中的任何文件更改时调用ls -la。每当检测到任何修改时,此命令会显示目录中的所有文件。
watchexec -- ls -la
  • 每当当前目录中的python、js、CSS或Html扩展名文件更改时运行命令。在这里,你可以传递任何你想要的命令。文件扩展名应以逗号分隔。
watchexec --exts py,js,css,html 
  • libsrc中的任何文件发生变化时运行命令。”-w”选项可监视系统中的特定文件或目录。
watchexec -w lib -w src 
  • 当当前目录(以及所有子目录)中的任何文件发生变化时,调用/重启任何服务。
watchexec -e html -r tor

watchexec -e js,py -r mysql

这里,“-r”选项可重新启动系统中正在运行的进程或服务。

要了解更多watchexec使用示例,请访问official GitHub repository

entr

entr是一个简单而优秀的命令行实用程序,可在给定目录中发生任何修改时运行任意命令。

“entr”代表”Event Notify Test Runner”。该工具旨在实现快速反馈和自动化测试。

安装

entr已预装在Linux发行版中。如果缺少,请手动安装。

该工具易于使用,并可使用以下命令进行安装。

sudo apt-get install entr

或者,您也可以通过克隆官方Git repository来安装它。

git clone https://github.com/eradman/entr.git

然后,进入该目录并使用以下命令安装要求。

./configure
make test
make install

要查看可用的构建选项,请运行./configure -h

示例命令

要查看entr命令的可用选项和参数,请使用以下命令。

man entr

此命令显示entr命令的用户手册。

NAME
     entr — 当文件发生更改时运行任意命令

SYNOPSIS
     entr [-acdnprsz] utility [argument /_ ...]

DESCRIPTION
     从标准输入中提供的文件列表,并使用提供的参数执行实用程序,如果其中任何一个发生更改,则entr等待子进程完成后响应后续文件系统事件。
     在进入监视循环之前,还会打开TTY以支持交互式实用程序。

     参数如下:

     -a      在实用程序运行时响应所有事件。如果没有此选项,entr会合并事件以避免循环。此选项与-r标志结合使用时无效。

     -c      在调用命令行上指定的实用程序之前清除屏幕。指定两次以擦除向上滚动的缓冲区。

     -d      跟踪作为输入提供的常规文件的目录,并在添加新文件时退出。此选项还可以显式指定目录。如果指定两次,则识别所有添加到目录中的新条目,否则将忽略以“.”开头的文件。

     -n      在非交互模式下运行。在此模式下,entr不会尝试从TTY读取或更改其属性。

     -p      推迟实用程序的第一次执行,直到文件被修改。

 手册页面entr(1)第1行(按h获取帮助或按q退出)
  • 在工作目录中的任何JavaScript文件更改时,启动和自动重新加载MySQL服务器。每次将更改保存到文件时,entr都会重新加载MySQL服务器。
 ls *.js | entr -r mysql
  • 自动重新加载网页服务器或在服务器退出时终止。
$ ls * | entr -rz ./httpd

要了解有关entr命令的更多详细信息和示例,请访问官方GitHub repository

总结 👩‍💻

希望你在学习如何在给定目录中文件发生变化时运行Linux命令以及创建新文件时找到这篇文章非常有用。

你可能也有兴趣学习如何remove files and directories in Linux。

类似文章