【问题标题】:Bash - A way to watch files for changes?Bash - 一种监视文件更改的方法?
【发布时间】:2014-05-18 01:16:06
【问题描述】:

我目前的解决方案是使用 python 库看门狗和 bash sn-p (originally taken from here)。

watchmedo shell-command client/js/src/templates/ proto/ --recursive \
  --patterns="*.soy;*.proto" \
  --command="echo \"WATCHMEDO file changed - rebuilding\"; make genfiles;"

基本上我在看几个模板文件,然后如果其中一个发生变化,就会自动运行 make genfiles。

我想知道是否有办法在纯 bash 中做到这一点?我宁愿我的所有开发人员都不必依赖那个 Python 库。

我在 OSX 上。

【问题讨论】:

  • 也许您可以结合使用md5sumWATCHME_<file name here> 形式的环境变量。将原始校验和存储在文件的环境中。 var 然后为该文件运行md5sum,如果该结果与文件的 env var 不匹配,您就知道它已更改。
  • 看起来最好的解决方案是使用这个库。 github.com/alandipert/fswatch。整洁的小东西,但这将我的依赖从 python 转移到 homebrew。我想没有内置命令可以做我想做的事。
  • 您需要多快速对变化做出反应?多久发生一次变化?正如 red cricket 向您建议的那样,可以进行简短的 find-mdsum 组合,但这一切都取决于您的需求......
  • 或者,也许您可​​以从fs_usage 命令获得可用的输出。 (需要以root身份运行)

标签: macos bash


【解决方案1】:
#!/bin/bash

watched_files=$@  # pass watched files as cmd line arguments

if [ -z "$watched_files" ]; then
    echo "Nothing to watch, abort"
    exit
else
    echo "watching: $watched_files"
fi

previous_checksum="dummy"
while [ 1 ]; do
    checksum=$(md5 $watched_files | md5)  # I use Mac so I have `md5`, in linux it's `md5sum`
    if [ "$checksum" != "$previous_checksum" ]; then
        echo "None shall pass!"  # do your stuff here
    fi
    previous_checksum="$checksum"
    sleep 1
done

【讨论】:

  • +1;一些建议:正确处理带有嵌入空格的文件名:watched_files=("$@")md5 "${watched_files[@]}";不要错误地报告第一次迭代中的更改:previous_checksum=if [[ -n $previous_checksum && $checksum != $previous_checksum ]]; then;正确报告错误:使用>&2stderr 输出错误消息,报告非零退出代码(例如exit 1)。
【解决方案2】:

这是一个不错的 cli FAM 客户端:http://fileschanged.sourceforge.net/

【讨论】:

  • 酷库。我忘了提到我在 OSX 上,而不是 Linux。看起来该库仅适用于 Linux?
  • 嗯,有针对 Linux 和 BSD 的构建,这并不奇怪。我希望它可以或多或少地为每个 unixoid 系统编译,所以 OSX 应该不是一个大问题。问题是:OSX 上是否有可用的 FAM?
猜你喜欢
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 2015-08-06
  • 2012-09-10
  • 1970-01-01
相关资源
最近更新 更多