基于包含的文件内容的目录的上次更改时间?

时间:2012-03-22 23:21:47

标签: shell directory find monitoring filesystemwatcher

是否可以计算目录的上次修改时间,并考虑更改文件内容?

我们正在尝试观看一系列上传目录,以确定用户FTP会话何时完成。

用户正在将一组文件上传到特定目录中,我们想要检测该目录中的最后一个文件何时在N分钟内没有变化。 (我们使用它作为&#34的代理; FTP会话完成"。)

我们从这开始就找到空闲时间超过5分钟但不到10分钟的目录:

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

此处使用的目录时间戳基于最新文件添加到目录的时间。

我已阅读Directory last modified date,很明显,读取目录的mtime或mmin无法正常工作,因为当目录中的文件更新内容时,它不会发生变化。因此,上述不会起作用,因为如果最后一个文件是一个大文件,可能需要>上传10分钟后,当触发此目录时,该目录确实已空闲(即所有文件保持不变)。

是否存在基于shell的替代方案(理想情况下是find命令的配置),它使用上次更改的文件的mtime作为时间戳,但仍然在目录级别运行(即我们不在&#39 ; t想要根据单个目录中的所有文件获得多次点击??

2 个答案:

答案 0 :(得分:2)

我同意@ shellter的评论,即标志文件是最好的方法。这取决于您的用户,但同意上传该文件。

查找当前目录下的最新文件

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

输出为2个字段:

  1. 自纪元以来的秒数,小数微秒
  2. 文件的相对路径

答案 1 :(得分:1)

我也在围栏的“替代解决方案”方面。

如果您可以访问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"

仅当vsftpd成功保存文件时才会添加UPLOAD行。您可以在这样的shell脚本中解析它:

#!/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

这不是最好的shell脚本,说实话,如果我自己使用它,我可能会写一点不同,但这足以说明这个想法。