Время последнего изменения каталога на основе содержимого файла? - PullRequest
2 голосов
/ 23 марта 2012

Можно ли рассчитать время последнего изменения каталога с учетом изменения содержимого файла?

Мы пытаемся просмотреть серию каталогов загрузки, чтобы определить, когда пользовательские сессии FTP завершены.

Пользователи загружают набор файлов в определенный каталог, и мы хотели бы определить, когда последний файл в этом каталоге не изменился в течение N минут.(Мы используем это как прокси для «FTP-сеанса завершено».)

Мы начали с этого, чтобы найти каталоги, которые простаивали более 5, но менее 10 минут:

find . -mmin +5 -mmin -10 -type d -ls

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

Я прочитал Дата последнего изменения каталога , и ясно, что чтение mtime или mmin для каталога не будет работать, поскольку оно не изменяется, когда файлы в каталоге имеют свое содержимоеобновлено.Таким образом, вышеприведенное не сработает, потому что если последний файл представляет собой большой файл, загрузка которого может занять> 10 минут, тогда каталог на самом деле не будет простаивать (т. Е. Все файлы останутся без изменений), когда это сработает.

Существуют ли альтернативы на основе оболочки (в идеале это конфигурация команды find), которые используют mtime последнего измененного файла внутри как метку времени, но все еще работают на уровне каталога (т.е. мы не хотим получать несколькохиты на основе всех файлов в одном каталоге)?

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

Я согласен с комментарием @ shellter о том, что файл флага - лучший путь. Это зависит от вашего пользователя, хотя согласиться загрузить этот файл.

Чтобы найти самый последний файл в текущем каталоге

find . -type f -printf "%T@ %p\n" | sort -nr | head -1

Выходные данные 2 поля:

  1. время в секундах с начала эпохи, с дробными микросекундами
  2. относительный путь к файлу
1 голос
/ 23 марта 2012

Я также на стороне "альтернативного решения" забора.

Если у вас есть доступ к журналу вашего FTP-сервера, я предлагаю настроить этот журнал, чтобы следить за успешной загрузкой. Такой подход, инициируемый событиями, будет быстрее, надежнее и менее загружен, чем подход опроса, подобный описанному в вашем вопросе.

То, как вы справитесь с этим, конечно, будет зависеть от вашего FTP-сервера. У меня есть один запущенный vsftpd , чьи журналы включают в себя такие строки:

Fri Mar 23 07:36:02 2012 [pid 94378] [joe] OK LOGIN: Client "10.8.7.16"
Fri Mar 23 07:36:12 2012 [pid 94380] [joe] OK UPLOAD: Client "10.8.7.16", "/path/to/file.zip", 8395136 bytes, 845.75Kbyte/sec
Fri Mar 23 07:36:12 2012 [pid 94380] [joe] OK CHMOD: Client "10.8.7.16", "/path/to/file.zip 644"

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

#!/bin/sh

tail -F /var/log/vsftpd.log | while read line; do
  if echo "$line" | grep -q 'OK UPLOAD:'; then
    filename=$(echo "$line" | cut -d, -f2)
    if [ -s "$filename" ]; then
      # do something with $filename
    fi
  fi
done

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

...