Verificar constantemente se o arquivo é modificado

7

Eu tenho um arquivo chamado arquivo1 que eu quero em um script, sempre que houver uma mudança nele, faça algo, um bip soará na verdade. Como eu faço isso?

    
por aDoN 06.11.2014 / 10:35

5 respostas

13

Se você tem inotify-tools instalado (pelo menos esse é o nome do pacote no Debian) quando você pode fazer algo assim:

while inotifywait -q -e modify filename >/dev/null; do
    echo "filename is changed"
    # do whatever else you need to do
done

Isso aguarda o evento "modify" acontecer com o arquivo chamado "filename". Quando isso acontece, o comando inotifywait produz filename MODIFY (que descartamos enviando a saída para / dev / null) e, em seguida, termina, o que faz com que o corpo do loop seja inserido.

Leia a página de manual de inotifywait para mais possibilidades.

    
por 06.11.2014 / 10:51
3

Veio à procura de um one-liner no MacOS. Resolvido no seguinte. Compilado e adicionado esta ferramenta ao meu caminho. Isso levou menos de 30 segundos.

$ git clone [email protected]:sschober/kqwait.git
$ cd kqwait
$ make
$ mv kqwait ~/bin
$ chmod +x ~/bin/kqwait

Em seguida, fui ao diretório em que queria assistir. Nesse caso, gostaria de ver um arquivo de marcação para alterações e, se alterado, emitir um make .

$ while true; do kqwait doc/my_file.md; make; done

É isso.

    
por 24.04.2016 / 20:49
2

Sem inotifywait, você pode usar este pequeno script e uma tarefa cron (a cada minuto):

#!/usr/bin/env bash
#
# Provides      : Check if a file is changed
# 
# Limitations   : none
# Options       : none
# Requirements  : bash, md5sum, cut
# 
# Modified      : 11|07|2014
# Author        : ItsMe
# Reply to      : n/a in public
#
# Editor        : joe
#
#####################################
#
# OK - lets work
#

# what file do we want to monitor?
# I did not include commandline options
# but its easy to catch a command line option
# and replace the defaul given here
file=/foo/bar/nattebums/bla.txt

# path to file's saved md5sum
# I did not spend much effort in naming this file
# if you ahve to test multiple files
# so just use a commandline option and use the given
# file name like: filename=$(basename "$file")
fingerprintfile=/tmp/.bla.md5savefile

# does the file exist?
if [ ! -f $file ]
    then
        echo "ERROR: $file does not exist - aborting"
    exit 1
fi

# create the md5sum from the file to check
filemd5='md5sum $file | cut -d " " -f1'

# check the md5 and
# show an error when we check an empty file
if [ -z $filemd5 ]
    then
        echo "The file is empty - aborting"
        exit 1
    else
        # pass silent
        :
fi

# do we have allready an saved fingerprint of this file?
if [ -f $fingerprintfile ]
    then
        # yup - get the saved md5
        savedmd5='cat $fingerprintfile'

        # check again if its empty
        if [ -z $savedmd5 ]
            then
                echo "The file is empty - aborting"
                exit 1
        fi

        #compare the saved md5 with the one we have now
        if [ "$savedmd5" = "$filemd5" ]
            then
                # pass silent
                :
            else
                echo "File has been changed"

                # this does an beep on your pc speaker (probably)
                # you get this character when you do:
                # CTRL+V CTRL+G
                # this is a bit creepy so you can use the 'beep' command
                # of your distro
                # or run some command you want to
                echo 
        fi

fi

# save the current md5
# sure you don't have to do this when the file hasn't changed
# but you know I'm lazy and it works...
echo $filemd5 > $fingerprintfile
    
por 07.11.2014 / 12:16
0

Você provavelmente não precisará comparar o md5sum se tiver o utilitário diff disponível.

if ! diff "$file1" "$file2" >/dev/null 2>&1; then
  echo "$file1 and $file2 does not match" >&2
  ## INSERT-YOUR-COMMAND/SCRIPT-HERE
  ## e.g. cp "$file1" "$file2"
fi

o! nega, e. true se a afirmação for falsa

Advertência é que você precisa do arquivo original para comparar com o diff que (imo) é o mesmo que o script md5sum está fazendo acima.

    
por 13.01.2015 / 05:27
0

Você pode tentar a entr ferramenta de linha de comando, por exemplo

$ ls file1 | entr beep
    
por 06.07.2016 / 19:04