如何在文件或目录更改时运行shell脚本?

Dre*_*eur 60 linux shell inotify

我想在特定文件或目录更改时运行shell脚本.

我怎么能轻松做到这一点?

Dom*_*kis 27

我使用此脚本在目录树中的更改上运行构建脚本:

#!/bin/bash -eu
DIRECTORY_TO_OBSERVE="js"      # might want to change this
function block_for_change {
  inotifywait --recursive \
    --event modify,move,create,delete \
    $DIRECTORY_TO_OBSERVE
}
BUILD_SCRIPT=build.sh          # might want to change this too
function build {
  bash $BUILD_SCRIPT
}
build
while block_for_change; do
  build
done
Run Code Online (Sandbox Code Playgroud)

用途inotify-tools.检查inotifywait 手册页,了解如何自定义触发构建的内容.

  • 很好的例子。我修复了您的非 bash 评论。 (2认同)

Fré*_*idi 21

使用inotify-tools.

  • 如果这个答案包含相关信息而不仅仅是一个链接,那将是很好的. (26认同)
  • [incron](http://inotify.aiken.cz/?section=incron&page=about&lang=en)是另一种选择. (12认同)
  • 我不认为简单地发布手册链接是非常有帮助的; 如果你给出了安装软件包的命令,以及常见用法的例子,如果访问者仍然需要更多信息,那么_then_链接到完整的文档会好得多. (4认同)
  • fanotify是另一种选择.建立在inotify之上.它对inotify有一些改进,例如它可以通知特定目录中的文件更改. (2认同)

ken*_*orb 21

您可以尝试使用entr工具在文件更改时运行任意命令.文件示例:

$ ls -d * | entr sh -c 'make && make test'
Run Code Online (Sandbox Code Playgroud)

要么:

$ ls *.css *.html | entr reload-browser Firefox
Run Code Online (Sandbox Code Playgroud)

对于目录使用Changed!,但您必须在循环中使用它,例如:

$ echo file.txt | entr echo Changed!
Run Code Online (Sandbox Code Playgroud)

要么:

while true; do find path/ | entr -d echo Changed; done
Run Code Online (Sandbox Code Playgroud)

  • `entr`是最简单,最易组合和unix-y工具.爱它.`incron`可以替换为`entr`和一个流程管理器,如`runit`,`s6`甚至`systemd`. (2认同)
  • 这个.它比inotifywait简单10倍 (2认同)
  • 我把它变成了[一个问题](/sf/ask/3951816431/) (2认同)

VDR*_*VDR 8

这个剧本怎么样?使用“stat”命令获取文件的访问时间,并在访问时间发生变化时(每当访问文件时)运行命令。

#!/bin/bash

while true

do

   ATIME=`stat -c %Z /path/to/the/file.txt`

   if [[ "$ATIME" != "$LTIME" ]]

   then

       echo "RUN COMMNAD"
       LTIME=$ATIME
   fi
   sleep 5
done
Run Code Online (Sandbox Code Playgroud)

  • 最好使用 `inotifywait`(inotify-tools),因为它在文件更新时几乎立即唤醒。(您的脚本在注意到之前最多等待 5 秒。)您的脚本还必须每 5 秒唤醒一次,生成一个进程,检查结果,然后返回睡眠状态,而这足以“在 5 秒内将其破解”分钟”-脚本,它会浪费 CPU 资源,应避免在生产代码中使用。 (7认同)