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

时间:2014-03-25 09:41:38

标签: php linux bash

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

我想整合一项功能,可以执行以下操作。提升用户在php应用程序上编写例如20140222的开始时间戳和结束时间戳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),我可以检索数据,在我看来正则表达式是这里的问题,所以如果我有比如目录中的4个文件是20140222_Activity ... 20140226_Activty。

如何使上面的命令返回与提供的timetsamp相关的文件?比如开始标记是20140223,结尾是20140225,只返回这个范围之间的名字文件,对不起我的英文不好。

2 个答案:

答案 0 :(得分:1)

您可以使用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

答案 1 :(得分:1)

使用单个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

$Start_time生成$End_timeseq之间连续数字的文件路径列表,并在循环中使用。如果文件存在且是常规文件,则调用head