Сценарий Bash - установление изменений текстового файла

В первую очередь, я довольно неопытен в этом, но мне нужен конкретный сценарий удара для одного из моих играющих серверов. Сценарий удара должен просто определить, получает ли particual текстовый документ периодически изменения в его содержании или нет.

Если там существуют какой-либо вид изменений в течение 30 секунд, сценарий должен сделать:

echo "text file content is changing"

Если там не существуют никакой вид изменений в течение 30 секунд, сценарий должен сделать:

echo "text file content is not changing"

После того, как сценарий удара определил изменения содержания, он должен повторяться непрерывно.

Править: Спасибо за всех Ваших парней справки! У меня есть другое беспокойство, действительно ли возможно, что сценарий решает автоматически, что последнее создавало/редактировало текстовый файл в конкретной папке? Это означает, был ли даже новый текстовый файл создан в той папке, в то время как сценарий определяет предыдущий текстовый файл, это должно отменить процесс и определить новый (последний) файл.

Заранее спасибо! :-)

0
задан 13 April 2017 в 12:27

2 ответа

Я использую /usr/bin/stat --format='%Y' на моем файле конфигурации и делаю частную копию каждый раз, когда "%Y time of last data modification, seconds since Epoch" изменения. Таким образом, я не должен читать целый файл только для проверки времени изменения.

Невыполнимые фрагменты кода:

original=""                     # set the <config.file>
original_update=0               # time <config.file> was last modified
config="/var/tmp/${me}.$.config" # my writable copy of config

...

function up-to-date () {
    # updates configuration file if necessary
    new_update="$(/usr/bin/stat --format='%Y' $original )"
    if [[  "$new_update" -ne "$original_update" ]] ; then
        if [[ $(countconfiglines "$original") -eq 0  ]] ; then
            echo "Invalid configuration in $original" >&2
            exit 4
        else
            /bin/cp --force "$original" "$config"
            original_update="$new_update"
        fi
    fi
    }

... 


else
    # watch for changes, record "%Y time of last modification,
    # seconds since Epoch"
    original_update="$(/usr/bin/stat --format='%Y' $original )"

    # make a writeable copy for our use, and clean it up at the end
    # unless $debug
    [[ $debug -ne 0 ]] || trap "/bin/rm -f $config" EXIT
    /bin/cp --force "$original" "$config"

fi

И я звоню up-to-date каждый раз вокруг моего основного цикла, когда я готов проанализировать новый файл конфигурации.

2
ответ дан 3 November 2019 в 11:31

Смотрящие отдельные файлы

контрольные суммы файла Использования здесь являются демонстрационным сценарием, который получил бы Вас движение.

#!/bin/bash

# do not put tabs before paths for second file through last file
files_to_check="/path/to/first/file
/path/to/second/file
/path/to/.../file"

delay=30

while true
do
    while read path
    do
        [ ! -e "$path.sha256" ] && sha256sum "$path" > "$path.sha256"
        status=$(sha256sum --quiet -c "$path.sha256"  > /dev/null 2>&1 && echo "No change!" || (echo "File changed!" && sha256sum "$path" > "$path.sha256"))
        [ "$status" == "No change!" ] && color="\e[0m" || color="\e[38;5;208m"
        printf "$color[%s] %s: %s\e[0m\n" $(date +%Y%m%d.%H%M%S) "$path" "$status"
    done <<< "$files_to_check"
    sleep $delay
    echo "-----------"
done

, Если Вы просто хотите проверить весь каталог рекурсивно, Вы могли бы передать вывод find /dir/to/check -type f к циклу с условием продолжения вместо списка файлов.

Вывод из сценария выше выглядит примерно так

[20170413.095401] a: No change!
[20170413.095401] b: No change!
-----------
[20170413.095431] a: No change!
[20170413.095431] b: No change!
-----------
[20170413.095501] a: File changed!
[20170413.095501] b: No change!
<час>

Сканирование всего каталога и наблюдение за добавлением/удалением/модификацией файлов

, Этот сценарий будет сканировать весь каталог каждые 30 секунд (не включая время, которое требуется для выполнения сканирования), и цветные (зеленые) дополнения, (красные) удаления, и (оранжевые) изменения.

#!/bin/bash

# do not put tabs before paths for second file through last file
dir_to_check="/path/to/directory"
delay=30

# please note that the time it takes to generate checksums will produce more time
# between loops than the actual delay
while true
do
    while read path
    do
        [ ! -e "${path/.sha256/}" ] && printf "\e[38;5;196m%s\e[0m\n" "[$(date +%Y%m%d.%H%M%S)] File removed: ${path/.sha256/}" && rm "$path"
    done <<< "$(find $dir_to_check -type f -iname "*\.sha256" | sort)"

    while read path
    do
        if [ ! -e "$path.sha256" ]; then
            printf "\e[38;5;046m%s\e[0m\n" "[$(date +%Y%m%d.%H%M%S)] New file found: $path (modified $(date --date="@$(stat --format="%Y" "$path")" +%Y%m%d.%H%M%S))"
            sha256sum "$path" > "$path.sha256"
        else
            status=$(sha256sum --quiet -c "$path.sha256"  > /dev/null 2>&1 && echo "No change!" || (echo "File changed! ($(date --date="@$(stat --format="%Y" "$path")" +%Y%m%d.%H%M%S))" && sha256sum "$path" > "$path.sha256"))
            [ "$status" == "No change!" ] && color="\e[0m" || color="\e[38;5;208m"
            printf "$color[%s] %s: %s\e[0m\n" $(date +%Y%m%d.%H%M%S) "$path" "$status"
        fi
    done <<< "$(find $dir_to_check -type f ! -iname "*\.sha256" | sort)"
    sleep $delay
    echo "-----------"
done

Вывод напоминает (извините, цвет не передает сюда)

[20170414.103126] /tmp/change/a: No change!
[20170414.103126] /tmp/change/b: No change!
[20170414.103126] /tmp/change/c: No change!
[20170414.103126] /tmp/change/run.sh: File changed! (20170414.103125)
-----------

    ...

-----------
[20170414.103156] File removed: /tmp/change/a
[20170414.103156] /tmp/change/b: No change!
[20170414.103156] /tmp/change/c: No change!
[20170414.103156] /tmp/change/run.sh: No change!
-----------
[20170414.103206] New file found: /tmp/change/a (modified 20170414.103200)
[20170414.103206] /tmp/change/b: No change!
[20170414.103206] /tmp/change/c: No change!
[20170414.103206] /tmp/change/run.sh: No change!
0
ответ дан 3 November 2019 в 11:31

Другие вопросы по тегам:

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