Вопрос или проблема
Я хочу определить, был ли файл изменен за последние x секунд на MacOS или Debian и т. д.
is_file_older_than() {
seconds="$1"
file="$2"
echo "Файл $file"
modified_secs="$(date -r "$file" +%s)"
current_secs="$(date +%s)"
diff="$(expr "$current_secs" - "$modified_secs")"
if [[ "$diff" -gt "$seconds" ]]; then
return 0
fi
return 1
}
if is_file_older_than 3 "$BASH_SOURCE"; then
echo 'старый'
else
echo 'молодой'
fi
Но у меня возникают проблемы с проверкой, работает ли это на 100%, и есть ли что-то ненадежное – похоже, что это работает
В zsh
:
if ()(($#)) file(N-ms-10); then
echo файл был изменен менее 10 секунд назад.
fi
С помощью FreeBSD find
(который, насколько я знаю, на основе которого создан macos)
if [ -n "$(find -H file -prune -mtime -10s)" ]; then
echo файл был изменен менее 10 секунд назад.
fi
Эквивалент с GNU find
(как в Debian), и это, похоже, работает с find
FreeBSD 14.0, по крайней мере, даже если это не документировано там (только форматы времени ISO8601 и RFC822, которые заявлены как поддерживаемые, как в man-странице find macos’ 15.0):
if [ -n "$(find -H file -prune -newermt '10 seconds ago')" ]; then
echo файл был изменен менее 10 секунд назад.
fi
Ответ или решение
Определение изменения файла за последние x секунд на MacOS и Debian
Чтобы определить, был ли файл изменен за последние x секунд, можно использовать несколько методов в зависимости от операционной системы (MacOS или Debian). В данном анализе мы рассмотрим различные подходы на Bash и Zsh, а также применение утилиты find
.
1. Использование Bash для проверки времени изменения файла
Вы уже предложили функцию is_file_older_than
. Давайте разберемся с ней подробнее:
is_file_older_than() {
seconds="$1"
file="$2"
echo "The file $file"
modified_secs="$(date -r "$file" +%s)"
current_secs="$(date +%s)"
diff="$(expr "$current_secs" - "$modified_secs")"
if [[ "$diff" -gt "$seconds" ]]; then
return 0
fi
return 1
}
if is_file_older_than 3 "$BASH_SOURCE"; then
echo 'old'
else
echo 'young'
fi
-
Объяснение:
- Функция принимает два аргумента: количество секунд и путь к файлу.
- Используется команда
date -r
, чтобы получить время последнего изменения файла в формате Unix-времени (количество секунд с 1 января 1970 года). - Текущее время также получаем в том же формате.
- Вычисляем разницу (
diff
) и сравниваем её с переданным значениемseconds
. - Если файл старше указанного времени, функция возвращает 0, иначе 1.
-
Проверка: Код выглядит корректно, однако вы можете добавить вывод текущее и модифицированное время для отладки, если хотите убедиться, что функция работает правильно.
2. Использование Zsh для проверки времени изменения файла
Вы также предложили использовать Zsh:
if ()(($#)) file(N-ms-10); then
echo file was last modified less than 10 seconds ago.
fi
- Объяснение: Это команда проверяет, существует ли файл и был ли он изменен менее чем 10 секунд назад. Она использует расширение
N
для получения информации о времени изменения файла.
3. Использование утилиты find
На MacOS (FreeBSD):
if [ -n "$(find -H file -prune -mtime -10s)" ]; then
echo file was last modified less than 10 seconds ago.
fi
На Debian (GNU find):
if [ -n "$(find -H file -prune -newermt '10 seconds ago')" ]; then
echo file was last modified less than 10 seconds ago.
fi
- Объяснение:
-mtime -10s
позволяет найти файлы, измененные менее чем на 10 секунд назад в FreeBSD/MacOS.-newermt '10 seconds ago'
делает то же самое в Debian.- Оба метода используют команду
find
и проверяют, существует ли файл с заданным временным критерием.
Заключение
Вышеизложенные методы могут эффективно проверить, был ли файл изменен за последние x секунд в обеих операционных системах. Ваш первоначальный подход с использованием Bash является основным и работает корректно, но также рассмотрите использование find
для более сложных случаев или для работы с большими каталогами.
SEO-оптимизация
Данная статья содержит ключевые фразы, такие как "определение изменения файла за последние x секунд", "проверка времени изменения файла", "Bash и Zsh" и "использование find", что поможет улучшить видимость текста в поисковых системах.
Помните, что точность проверки может зависеть от различных факторов, включая файловую систему и её настройки, поэтому рекомендуется протестировать предложенные подходы в вашей конкретной среде, чтобы убедиться в их надежности.