Linux-скрипт, который отслеживает изменения файлов в папках (как это делает autospec!)

Я хочу автоматически запускать сборку при каждом изменении файла.

Я использовал autospec (RSpec) в Ruby, и мне это понравилось.

Как это можно сделать в Баше?


person Ian Vaughan    schedule 04.06.2010    source источник
comment
см. также stackoverflow.com/q/4060212/119790   -  person Ian Vaughan    schedule 10.02.2011
comment
см. также stackoverflow.com/q/880263/119790   -  person Ian Vaughan    schedule 10.02.2011
comment
См. также superuser.com/questions/181517/   -  person Denilson Sá Maia    schedule 12.03.2014


Ответы (6)


Взгляните на incron и inotify-tools.

person Dennis Williamson    schedule 04.06.2010
comment
В частности, см. github.com/tartley/rerun2, который использует инструменты inotify и упрощает запуск пользовательская команда, как описано в забытом ответе Джонатана Хартли о суперпользователе - person nealmcb; 23.11.2015

ключевые слова — это команды inotifywait и inotifywatch.

person zed_0xff    schedule 04.06.2010

Прочитав ответы на другие сообщения, я нашел сообщение (теперь его нет), я создал этот скрипт: -

#!/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
person Ian Vaughan    schedule 10.02.2011
comment
это самое ужасное решение. он будет извлекать все файлы из каталога каждую секунду, что является огромным ударом по производительности. пожалуйста, посмотрите на решение Денниса Уильямсона !!! - person kritzikratzi; 23.05.2012
comment
Пожалуйста, удалите свои отрицательные голоса из моих ответов, они являются действительными ответами и работают, просто потому, что они неприемлемы для вашего использования, они подходят для меня и, возможно, для других людей. Таким образом, понижение голосов означает, что другие не будут пробовать этот ответ. На самом деле отрицательные голоса предназначены только для вещей, которые вообще не работают или не по теме и т. д. А также, пожалуйста, отредактируйте свои комментарии, удалив слово «ужасно», это ваш личный выбор, вы можете сказать, что это не влияет на производительность, но оставьте это при этом. Ваше здоровье. - person Ian Vaughan; 03.05.2013
comment
То, что что-то работает, не означает, что это хорошая идея. На мой взгляд, ваш ответ столь же тривиален и проблематичен. Не вижу причин удалять свой минус. - person kritzikratzi; 04.05.2013
comment
Хорошо, это ваш выбор, что бы вы ни выбрали, но могу ли я указать stackoverflow.com/привилегии/голоса-вниз Используйте свой отрицательные голоса всякий раз, когда вы сталкиваетесь с вопиюще небрежным постом, не затраченным усилий, или ответом, который явно и, возможно, опасно неверен. Если вы все еще верите в обратное, то это нормально, спасибо. - person Ian Vaughan; 08.05.2013
comment
я на самом деле дважды проверил руководящие принципы голосования, прежде чем опубликовать свой последний комментарий. - person kritzikratzi; 08.05.2013
comment
Я собираюсь провести некоторое тестирование производительности этого решения, я думаю, что работал где-то, где было что-то подобное, и я чувствую, что это не так уж ужасно, но все относительно. - person NateDSaint; 24.10.2013
comment
Я знаю, что это не оптимальное решение, но на некоторых системах вы не можете использовать или установить inotify, но у вас есть оболочка... в этом случае мы можем сделать все, что работает. Спасибо Ян! - person MilMike; 07.07.2016

Как насчет этого скрипта? Использует команду '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
person VDR    schedule 20.08.2013
comment
Ну, мы также можем использовать команду stat для доступа/мониторинга времени доступа к DIR: stat -c %Z /var/tmp скрипт срабатывает всякий раз, когда в ДИР - person VDR; 21.08.2013
comment
Мне очень нравится простота этого решения. - person Richard; 12.05.2017

См. этот пример как улучшение ответа Яна Вогана:

#!/usr/bin/env bash
# script:  watch
# author:  Mike Smullin <[email protected]>
# 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
person Mike S    schedule 31.08.2013

Если у вас установлен entr, то в оболочке вы можете использовать следующий синтаксис:

while true; do find src/ | entr -d make build; done
person kenorb    schedule 06.07.2016