Постоянно проверяйте, изменяется ли файл удар

У Вас есть два пути, как обычно, простой и твердый. Простой должен использовать внутренние переменные, например

program -in otherfile -out file.out

Здесь переменная

0$ = название сценария
1$ = - в
2$ = otherfile, и т.д.

Твердый путь состоит в том, чтобы использовать getopt, больше информации можно найти здесь.

8
18.10.2017, 10:33
6 ответов

без inotifywait вы можете использовать этот маленький скрипт и вакансию CRON (каждую минуту или около того):

#!/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
2
27.01.2020, 20:09

Мы столкнулись с той же проблемой и последовали шагам в ответе. Но у нас все равно не получилось. Наша проблема заключалась в том, что вход работал от одного клиента, но не от другого (каталог .ssh был установлен NFS, и оба клиента использовали одни и те же ключи).

Так что нам пришлось идти на шаг дальше. При выполнении команды ssh в подробном режиме вы получаете много информации.

ssh -vv user@host

Мы обнаружили, что ключ по умолчанию (id_rsa) не был принят, и вместо этого ssh-клиент предложил ключ, соответствующий имени хоста клиента:

debug1: Offering public key: /home/user/.ssh/id_rsa                                    
debug2: we sent a publickey packet, wait for reply                                        
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Offering public key: /home/user/.ssh/id_dsa                                    
debug2: we sent a publickey packet, wait for reply                                        
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Offering public key: user@myclient                                          
debug2: we sent a publickey packet, wait for reply                                        
debug1: Server accepts key: pkalg ssh-rsa blen 277                  

Очевидно, что это не сработает ни от одного другого клиента.

Таким образом, решение в нашем случае было переключить ключ rsa по умолчанию на ключ, который содержал user @ myclient. При использовании ключа по умолчанию проверка имени клиента не выполняется.

Затем мы столкнулись с другой проблемой, после переключения. Видимо, ключи кэшируются в локальном ssh agent и мы получили следующую ошибку в журнале отладки:

'Agent admitted failure to sign using the key'

Это было решено путем перезагрузки ключей к ssh agent:

ssh-add
-121--1363-

jq работает довольно хорошо, как такой вид объектно-ориентированного слоя.

-121--11282-

Если у вас установлены средства уведомления (по крайней мере, это имя пакета на Debian), когда вы сможете сделать что-то подобное:

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

Это ожидает события «modify» для файла с именем «filename». Когда это происходит, команда inotifywait выводит имя файла MODIFY (которое мы отбрасываем, отправляя выходные данные в/dev/null), а затем завершает, что приводит к вводу тела цикла.

Дополнительные возможности см. в руководстве по inotifywait .

14
27.01.2020, 20:09

Вам, вероятно, не нужно сравнивать MD5Sum, если у вас есть доступная утилита.

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

отрицает E.g. TRUE, если утверждение является ложным

предостережением, вам нужен исходный файл для сравнения с Diff который (IMO) такой же, как то же, что делает скрипт MD5SUM выше.

0
27.01.2020, 20:09

Пришел в поисках однострочника для MacOS. Остановился на следующем. Скомпилировал и добавил этот инструмент в свой путь. Это заняло менее 30 секунд.

$ git clone git@github.com:sschober/kqwait.git
$ cd kqwait
$ make
$ mv kqwait ~/bin
$ chmod +x ~/bin/kqwait

Затем я зашел в каталог, в котором хотел провести просмотр. В этом случае я хотел посмотреть файл уценки на предмет изменений, и, если он изменился, сделайте make .

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

Вот и все.

2
27.01.2020, 20:09

Вы можете попробовать инструмент командной строки entr , например

$ ls file1 | entr beep
0
27.01.2020, 20:09

если вы проверяете изменения в репозитории git, вы можете использовать:

#!/usr/bin/env bash

diff="$(git diff | egrep some_file_name_or_file_path | cat)"

if [[ -n "$diff" ]] ; then
    echo "==== Found changes: ===="
    echo "diff: $diff"
    exit 1
else
    echo 'Code is not changed'
fi

0
27.01.2020, 20:09

Теги

Похожие вопросы