Как определить, был ли файл изменен за последние x секунд

Вопрос или проблема

Я хочу определить, был ли файл изменен за последние 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", что поможет улучшить видимость текста в поисковых системах.

Помните, что точность проверки может зависеть от различных факторов, включая файловую систему и её настройки, поэтому рекомендуется протестировать предложенные подходы в вашей конкретной среде, чтобы убедиться в их надежности.

Оцените материал
Добавить комментарий

Капча загружается...