检查需要处理的新文件的最佳方法

问题描述:

这是一个比真正特定于语言的问题更普遍的问题。我必须实现一个程序,它会自动处理csv文件(读取文件,写入数据库,移动文件)。这根本不是问题。检查需要处理的新文件的最佳方法

问题是 - 我有一个目录结构像下面那样,并且如果有任何需要处理的新文件需要定期检查(将会像5分钟左右)...

-+ basedir 
--+ AT (ISO country abbreviation ...) 
--+ DE 
---+ ID1234 (directory for user) 
---+ ID2345 
---+ ID4523 
---+ ... 

你知道如何以非常高效的方式浏览每个目录吗?我认为对所有目录执行循环并扫描它们并不是那么好。

文件通过FTP上传,我完全控制服务器。

看着自己的FTP服务器上的日志是一个好主意,尤其是如果你有很多子目录进行扫描。 A tail避免了轮询解决方案的开销,并且会精确地告诉您在哪里查找文件。但是,我认为,使用shell比使用PHP更容易实现。

我有一个服务器,该服务器产生的日志,其中包括像这样的线路上vsftpd的:

Fri Feb 24 05:37:43 2012 [pid 86561] [bob] OK UPLOAD: Client "10.2.3.4", "/path/to/file.txt", 6036 bytes, 32.77Kbyte/sec 

要触发基于此行动,我可以用一个shell脚本如下所示:

#!/bin/sh 

tail -F /var/log/vsftpd.log | while read junk junk junk junk junk junk junk user status command junk sourceip file junk; do 
    if [ "$command" = "UPLOAD:" -a "$status" = "OK" ]; then 
    if echo "$file" | grep -q '/path/to/.*\.txt'; then 
     # do some triggered action, like: 
     sql="INSERT INTO log VALUES ('$user', '$sourceip', '$file')" 
     if mysql -uusername -ppasswd -Ddbname -e"$sql"; then 
     filename="`echo \"$file\" | sed -r 's/\"(.*)\",$/\\1/'`" 
     mv "$filename" /path/to/donefiles/ 
     fi 
    fi 
    fi 
done 

这可以使用您的操作系统的正常启动工具启动,或由cron使用@reboot特殊启动。

添加错误处理的味道。

+0

听起来相当不错。必须检查出来。同时谢谢你:-)! – thedom 2012-03-06 17:40:56

您可以为ftp设置日志并解析日志以查找新事件。

或者尝试类似的inotify,fschange,审计,...