Linux如何列出大于文件名中特定时间戳的文件?

时间:2014-05-28 09:51:32

标签: linux date unix datetime timestamp

我在 linux 中有一个目录,其中包含一个日志文件列表,如果某些作业运行,则会自动生成日志文件。每个日志文件都附加时间戳,如“ JobName_TimeStamp

更新:

job_2014-05-28_15:05:26.log
job_2014-05-28_15:06:58.log
job_2014-05-28_15:07:02.log
job_2014-05-28_15:07:57.log
job_2014-05-28_15:08:00.log
job_2014-05-28_15:08:01.log
job_2014-05-28_15:08:09.log
job_2014-05-28_15:08:10.log
job_2014-05-28_15:08:11.log
job_2014-05-28_15:08:12.log
job_2014-05-28_15:08:13.log
job_2014-05-28_15:08:14.log
job_2014-05-28_15:08:22.log

job1_2014-05-28_15:08:11.log
job1_2014-05-28_15:08:12.log
job1_2014-05-28_15:08:13.log
job1_2014-05-28_15:08:14.log
job1_2014-05-28_15:08:22.log

我想运行一个linux命令来列出大于特定时间戳的所有文件?

对于示例1 :我将传递两个参数,如果给出的 TimeStamp 为“ 2014-05-28_15:08:00 职位名称是“职位

我应该将列表作为

job_2014-05-28_15:08:01.log
job_2014-05-28_15:08:09.log
job_2014-05-28_15:08:10.log
job_2014-05-28_15:08:11.log
job_2014-05-28_15:08:12.log
job_2014-05-28_15:08:13.log
job_2014-05-28_15:08:14.log
job_2014-05-28_15:08:22.log

示例2 :我将传递两个参数,如果 TimeStamp 给定为“2014-05-28_15:08:11”且作业名称为“的 JOB1

我应该将列表作为

job1_2014-05-28_15:08:12.log
job1_2014-05-28_15:08:13.log
job1_2014-05-28_15:08:14.log
job1_2014-05-28_15:08:22.log

任何解决方案?

感谢。

2 个答案:

答案 0 :(得分:1)

只需比较名称即可完成工作:

ls | sort | awk '{if ($0 > "job_2014-05-28_15:08:00.log") {print}}'
可能不需要

sort,但我把它放在这里以确保名称按字母顺序排序。

修改

上述命令不适用于具有不同前缀或后缀的文件名。但是如果你能确保1.文件名中没有空格2.日期格式部分是相同的。你可以写这样的代码:

ls | sort \
   | sed 's/\(^.*$\)/& &/' \
   | sed 's/.*\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}_[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\).* \(.*\)/\1 \2/' \
   | awk '{if ($1 > "2014-05-28_15:08:00") {print $2}}'

它看起来很脏,不可能是最好的,但应该有效。你可以根据这个想法写下自己的基础。

答案 1 :(得分:1)

使用这个简单的bash脚本并获取输出

#!/bin/bash
pattern1=`echo $1 | sed  's/_/ /'`;
pattern2=`date -d "$pattern1" "+%s"`
for file in `ls *.log` 
do
    job=`echo "$file" |  sed -r 's/([^_]+).*/\1/g'`
    time=`echo "$file" | sed -r 's/([^_]+_)(.*)_(.*)\..*/\2 \3/g'`
    pattern3=`date -d "$time" "+%s"`
            if [ $2 == $job ]  && [ $pattern3 -gt $pattern2 ] ; then 
                    echo  "$file" 
            fi
done

你必须运行这个方法

 $bash script_file.sh <timestamp> <job>

$bash script_file.sh 2014-05-28_15:08:00 job

而不是pattern1 = echo $1 | sed 's/_/ /'

您将以下行放在该位置。

job1=`echo $1 | sed -r 's/([^_]+).*/\1/g'`;
pattern1=`echo $1 | sed -r 's/([^_]+_)(.*)_(.*)\..*/\2 \3/g'`

而不是if语句上的$ 2,你需要把$ job1。