Bash Script - изменение текстовых файлов

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

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

echo "text file content is changing"

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

echo "text file content is not changing"

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

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

Спасибо заранее! : -

)
0
задан 13 April 2017 в 22:27

17 ответов

Я использую /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
ответ дан 22 May 2018 в 23:42
  • 1
    Что вы имеете в виду с «Необручаемыми фрагментами кода»? Я очень неопытен с этим сценарием, и я не знаю, как отредактировать ваш скрипт. Спасибо, что помог мне :-) – Phillip 13 April 2017 в 21:14
  • 2
    Мне нравится этот ответ (отсюда и голосование), но он только улавливает законные изменения в файле. Невозможно обнаружить повреждение или изменения вредоносного ПО. Опять же, нет никаких признаков того, что автор вопроса заинтересован в этом вообще. – b_laoshi 14 April 2017 в 04:14
  • 3
    Этот подход, хотя и быстрее, чем использование контрольных сумм, также возвращает ложные срабатывания, если файл просто тронут, оставаясь неизмененным. – b_laoshi 14 April 2017 в 05:52

Я использую /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
ответ дан 18 July 2018 в 15:05

Я использую /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
ответ дан 24 July 2018 в 20:33

Я использую /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
ответ дан 31 July 2018 в 23:35

Я использую /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 August 2018 в 20:50

Я использую /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
ответ дан 5 August 2018 в 05:30

Я использую /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
ответ дан 6 August 2018 в 22:37

Я использую /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
ответ дан 9 August 2018 в 03:03

Я использую /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
ответ дан 14 August 2018 в 21:21
  • 1
  • 2
    Мне нравится этот ответ (отсюда и голосование), но он только улавливает законные изменения в файле. Невозможно обнаружить повреждение или изменения вредоносного ПО. Опять же, нет никаких признаков того, что автор вопроса заинтересован в этом вообще. – b_laoshi 14 April 2017 в 04:14
  • 3

Просмотр отдельных файлов

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

#!/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 в цикл while вместо списка файлов.

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

[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
ответ дан 22 May 2018 в 23:42
  • 1
    Вероятно, md5sum будет достаточным, но создание коллизий возможно, хотя, возможно, не в течение 30 секунд на момент написания. Если вы имеете дело с большими файлами, для вычисления контрольных сумм MD5 требуется меньше времени. – b_laoshi 13 April 2017 в 04:59
  • 2
    Спасибо за этот скрипт! Я попробую это через несколько часов :-) – Phillip 13 April 2017 в 18:41
  • 3
    Здравствуйте, снова :-) ваш скрипт отлично работает! спасибо – Phillip 13 April 2017 в 22:16

Просмотр отдельных файлов

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

#!/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 в цикл while вместо списка файлов.

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

[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
ответ дан 18 July 2018 в 15:05

Просмотр отдельных файлов

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

#!/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 в цикл while вместо списка файлов.

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

[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
ответ дан 24 July 2018 в 20:33
  • 1
    Вероятно, md5sum будет достаточным, но создание коллизий возможно, хотя, возможно, не в течение 30 секунд на момент написания. Если вы имеете дело с большими файлами, для вычисления контрольных сумм MD5 требуется меньше времени. – b_laoshi 13 April 2017 в 04:59
  • 2
    Спасибо за этот скрипт! Я попробую это через несколько часов :-) – Phillip 13 April 2017 в 18:41
  • 3
    Здравствуйте, снова :-) ваш скрипт отлично работает! спасибо – Phillip 13 April 2017 в 22:16

Просмотр отдельных файлов

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

#!/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 в цикл while вместо списка файлов.

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

[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
ответ дан 31 July 2018 в 23:35
  • 1
    Вероятно, md5sum будет достаточным, но создание коллизий возможно, хотя, возможно, не в течение 30 секунд на момент написания. Если вы имеете дело с большими файлами, для вычисления контрольных сумм MD5 требуется меньше времени. – b_laoshi 13 April 2017 в 04:59
  • 2
    Спасибо за этот скрипт! Я попробую это через несколько часов :-) – Phillip 13 April 2017 в 18:41
  • 3
    Здравствуйте, снова :-) ваш скрипт отлично работает! спасибо – Phillip 13 April 2017 в 22:16

Просмотр отдельных файлов

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

#!/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 в цикл while вместо списка файлов.

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

[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 August 2018 в 20:50

Просмотр отдельных файлов

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

#!/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 в цикл while вместо списка файлов.

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

[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
ответ дан 5 August 2018 в 05:30

Просмотр отдельных файлов

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

#!/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 в цикл while вместо списка файлов.

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

[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
ответ дан 6 August 2018 в 22:37

Просмотр отдельных файлов

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

#!/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 в цикл while вместо списка файлов.

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

[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
ответ дан 9 August 2018 в 03:03

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

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