【问题标题】:linux script that monitors file changes within folders (like autospec does!)监视文件夹内文件更改的 linux 脚本(就像 autospec 一样!)
【发布时间】:2011-02-27 16:51:49
【问题描述】:

我想在文件更改时自动启动构建。

我在 Ruby 中使用过 autospec (RSpec) 并喜欢它。

如何在 bash 中做到这一点?

【问题讨论】:

标签: linux bash build automation rspec


【解决方案1】:

看看incroninotify-tools

【讨论】:

【解决方案2】:

关键字是 inotifywait 和 inotifywatch 命令

【讨论】:

    【解决方案3】:

    在阅读了其他帖子的回复后,我找到了一个帖子(现已消失),我创建了这个脚本:-

    #!/bin/bash
    
    sha=0
    previous_sha=0
    
    update_sha()
    {
        sha=`ls -lR . | sha1sum`
    }
    
    build () {
        ## Build/make commands here
        echo
        echo "--> Monitor: Monitoring filesystem... (Press enter to force a build/update)"
    }
    
    changed () {
        echo "--> Monitor: Files changed, Building..."
        build
        previous_sha=$sha
    }
    
    compare () {
        update_sha
        if [[ $sha != $previous_sha ]] ; then changed; fi
    }
    
    run () {
        while true; do
    
            compare
    
            read -s -t 1 && (
                echo "--> Monitor: Forced Update..."
                build
            )
    
        done
    }
    
    echo "--> Monitor: Init..."
    echo "--> Monitor: Monitoring filesystem... (Press enter to force a build/update)"
    run
    

    【讨论】:

    • 这是最可怕的解决方案。它将每秒从一个目录中读取所有文件,这对性能造成了巨大的影响。请看 dennis williamson 的解决方案!!!
    • 请从我的答案中删除您的反对意见,它们是有效的答案并且有效,只是因为它们不适合您的使用,它们对我来说很好,也可能对其他人也很好。因此,downvoting 意味着其他人不会尝试这个答案。否决票实际上仅适用于根本不起作用或无关紧要的事情等。另外,请编辑您的 cmets 删除“可怕”一词,这是您的个人选择,欢迎您说它对性能没有影响,但请留下它在那。干杯。
    • 因为某些东西有效并不意味着它是一个好主意。在我看来,您的回答同样微不足道且有问题。我认为没有理由删除我的反对票。
    • 好吧,随便你选,但我可以指出stackoverflow.com/privileges/vote-down“每当你遇到一个非常草率、不费吹灰之力的帖子,或者一个明确的答案时,请使用你的反对票也许是危险的不正确。”。我会争辩说,它不是马虎,也不是不努力,而且它肯定不是危险的不正确。如果您仍然不相信,那很好,谢谢。
    • 在发表我的最后一条评论之前,我实际上仔细检查了否决准则。
    【解决方案4】:

    这个脚本怎么样?使用“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
    

    【讨论】:

    • 好吧,我们也可以使用 stat 命令来访问/监控 DIR 访问时间:stat -c %Z /var/tmp 脚本随时触发DIR中有任何添加或删除
    • 我真的很喜欢这个解决方案的简单性。
    【解决方案5】:

    请参阅 this 示例作为对 Ian Vaughan 答案的改进:

    #!/usr/bin/env bash
    # script:  watch
    # author:  Mike Smullin <mike@smullindesign.com>
    # license: GPLv3
    # description:
    #   watches the given path for changes
    #   and executes a given command when changes occur
    # usage:
    #   watch <path> <cmd...>
    #
    
    path=$1
    shift
    cmd=$*
    sha=0
    update_sha() {
      sha=`ls -lR --time-style=full-iso $path | sha1sum`
    }
    update_sha
    previous_sha=$sha
    build() {
      echo -en " building...\n\n"
      $cmd
      echo -en "\n--> resumed watching."
    }
    compare() {
      update_sha
      if [[ $sha != $previous_sha ]] ; then
        echo -n "change detected,"
        build
        previous_sha=$sha
      else
        echo -n .
      fi
    }
    trap build SIGINT
    trap exit SIGQUIT
    
    echo -e  "--> Press Ctrl+C to force build, Ctrl+\\ to exit."
    echo -en "--> watching \"$path\"."
    while true; do
      compare
      sleep 1
    done
    

    【讨论】:

      【解决方案6】:

      如果你已经安装了entr,那么在shell中你可以使用以下语法:

      while true; do find src/ | entr -d make build; done
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-18
        • 2015-08-06
        • 1970-01-01
        • 2013-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多