2010-06-04 11 views
17

quiero patear automáticamente una acumulación cada vez que un archivo cambia.script de Linux que monitorea los cambios de archivos dentro de las carpetas (como Autospec hace!)

He usado autospec (RSpec) en Ruby y me encantó eso.

¿Cómo se puede hacer esto en bash?

+0

ver también http://stackoverflow.com/q/4060212/119790 –

+0

vea también http://stackoverflow.com/q/880263/119790 –

+0

Vea también http://superuser.com/questions/18151 7/cómo-a-ejecutar-a-comando-siempre-a-archivo-cambia –

Respuesta

5

Después de leer las respuestas a otros puestos, me encontré con un post (ahora desaparecido), he creado este script: -

#!/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 
+9

esta es la solución más horrible. Reanudará todos los archivos de un directorio cada segundo, lo cual es un gran golpe de rendimiento. por favor mira la solución de dennis williamson !!! – kritzikratzi

+2

Por favor elimine sus votos abajo de mis respuestas, son respuestas válidas y funcionan, simplemente porque no son aceptables para su uso, han estado bien para el mío, y posiblemente para otras personas también. Por lo tanto, la declinación significa que otros no intentarán esta respuesta. Los votos a favor son solo para cosas que no funcionan para nada o están fuera del tema, etc. Y también edite sus comentarios eliminando la palabra horrible, es una opción personal suya, puede decir que no es un golpe de rendimiento, pero déjelo. a eso. Aclamaciones. –

+4

Porque algo funciona no significa que sea una buena idea hacerlo. En mi opinión, tu respuesta es igualmente trivial y problemática. No veo ninguna razón para eliminar mi voto negativo. – kritzikratzi

5

palabras clave son inotifywait & inotifywatch comandos

14

Tome un vistazo a incron y inotify-tools.

+0

En particular, ver https://github.com/tartley/rerun2 que utiliza inotify-herramientas y hace que sea fácil de ejecutar un comando personalizado, como se explica en [la respuesta no vista por Jonathan Hartley sobre el superusuario] (http://superuser.com/a/970780/60931) – nealmcb

5

¿Qué hay de este script? Utiliza el comando 'stat' para obtener el tiempo de acceso de un archivo y ejecuta un comando siempre que haya un cambio en el tiempo de acceso (siempre que se acceda al archivo).

#!/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 
+0

Gracias, un punto, que solo monitorea un archivo 'ATIME'. –

+2

Bueno, podemos usar el comando ** stat ** para acceder/monitorear el tiempo de acceso DIR también: ** stat -c% Z/var/tmp ** script se activa cada vez que hay alguna adición o eliminación en DIR – VDR

+0

Realmente como la simplicidad de esta solución. – Richard

2

Ver this ejemplo, como una mejora sobre en la respuesta de Ian Vaughan:

#!/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 
2

Si usted tiene entr instalado, a continuación, con cáscara se puede utilizar la siguiente sintaxis:

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