根据文件的时间戳名称查找文件名


Find file names based on the timestamp name of the file,

我有一个目录,其中日志文件被远程ftp不断推送。例如,文件名为"20140222_Activity",即YYYY-MM-DD_Activity。我已经完成了一个php应用程序,它可以远程执行linux机器上的命令并检索输出。

我想集成一个功能,它将做以下事情。用户被提升为编写开始时间戳,例如20140222,以及php应用程序上的结束时间戳20140227。数据被转发到在linux机器上执行的bash命令,数据被转发回php应用程序。我遇到的问题如下:

find /opt/p_logs/vlogs/300/[$Start_time-$End_time]_Activity.log | xargs head -n 2

其中$Start_time$End_time是来自php表单的$_POST数据。

如果$Start_time$End_time戳是0-9,我可以检索数据,但这里是8位数字长(20140222),在我看来,regex是这里的问题,所以如果我在目录中有4个文件是20140222_Activity…20140226 _activty。

我如何使上面的命令返回与所提供的timesamp相关的文件?例如,如果开始戳记是20140223,结束戳记是20140225,则只返回该范围内的名称文件,对不起,我的英语不好。

这不能通过单个find命令完成,因为find不提供这种类型的文件名比较。

但是,您可以直接生成文件名并显式打开文件,而不是搜索匹配的文件名:

for name in $( seq -f "/opt/p_logs/vlogs/300/%.0f_Activity" $Start_time $End_time); do
    [[ -f $name ]] && head -n 2 $name
done

seq生成$Start_time$End_time连续编号的文件的路径列表,并用于循环。

如果文件存在并且是一个常规文件,则调用head

您可以使用seq在开始日期和结束日期之间创建数字序列,然后循环遍历该序列以运行命令:

for f in $(seq -f "%.0f" $start_time $end_time); do 
    # do whatever you want to the file here
    head -2 "/opt/p_logs/vlogs/300/${f}_Activity"
done