Прежде всего, я довольно неопытен в этом, но мне нужен конкретный сценарий bash для одного из моих игровых серверов. Сценарий bash должен просто определять, периодически ли текстовый документ получает изменения в своем содержании или нет.
Если в течение 30 секунд существуют какие-либо изменения, сценарий должен делать:
echo "text file content is changing"
Если в течение 30 секунд не существует каких-либо изменений, сценарий должен do:
echo "text file content is not changing"
После того, как скрипт bash определил изменения содержимого, он должен постоянно повторяться.
EDIT: Спасибо за вашу помощь! У меня есть еще одна проблема: возможно ли, что скрипт автоматически определяет последний созданный / отредактированный текстовый файл в определенной папке? Это означает, что даже если в этой папке был создан новый текстовый файл, в то время как скрипт определяет предыдущий текстовый файл, он должен отменить процесс и определить новый (последний) файл.
Спасибо заранее! : -
)Я использую /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 каждый раз вокруг моего основного цикла, когда я готов проанализировать новый файл конфигурации.
Я использую /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 каждый раз вокруг моего основного цикла, когда я готов проанализировать новый файл конфигурации.
Я использую /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 каждый раз вокруг моего основного цикла, когда я готов проанализировать новый файл конфигурации.
Я использую /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 каждый раз вокруг моего основного цикла, когда я готов проанализировать новый файл конфигурации.
Я использую /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
вокруг моего основного цикла, когда я готов проанализировать новый файл конфигурации.
Я использую /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
вокруг моего основного цикла, когда я готов проанализировать новый файл конфигурации.
Я использую /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
вокруг моего основного цикла, когда я готов проанализировать новый файл конфигурации.
Я использую /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
вокруг моего основного цикла, когда я готов проанализировать новый файл конфигурации.
Я использую /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
вокруг моего основного цикла, когда я готов проанализировать новый файл конфигурации.
Просмотр отдельных файлов
Используйте контрольные суммы файлов, вот пример сценария, который заставит вас идти.
#!/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!
Просмотр отдельных файлов
Используйте контрольные суммы файлов, вот пример сценария, который заставит вас идти.
#!/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!
Просмотр отдельных файлов
Используйте контрольные суммы файлов, вот пример сценария, который заставит вас идти.
#!/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!
Просмотр отдельных файлов
Используйте контрольные суммы файлов, вот пример сценария, который заставит вас идти.
#!/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!
Просмотр отдельных файлов
Используйте контрольные суммы файлов, вот пример сценария, который заставит вас идти.
#!/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!
Просмотр отдельных файлов
Используйте контрольные суммы файлов, вот пример сценария, который заставит вас идти.
#!/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!
Просмотр отдельных файлов
Используйте контрольные суммы файлов, вот пример сценария, который заставит вас идти.
#!/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!
Просмотр отдельных файлов
Используйте контрольные суммы файлов, вот пример сценария, который заставит вас идти.
#!/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!