web-dev-qa-db-ja.com

ファイル名に特定のタイムスタンプより大きいファイルをリストしますか?

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の場合:2つのパラメーターを渡します。TimeStampの場合は "2014-05-28_15:08:"および- ジョブ名は "ジョブ"

私はリストを取得する必要があります

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: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

解決策はありますか?

3
Kabilan

以下のコードは機能しました:

 for i in myjob*; do
           if [[ "myjob_2014-05-28_15:08:00.log" < "$i" ]]; then
                  echo $i
           fi
 done
2
Kabilan

Perlソリューション:

$ Perl -nle '
    BEGIN {$t = "2014-05-28_15:08:00"}
    if (/_(.*?)\./) {
        print if $1 gt $t;
    }
' file
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

更新

単純なPerlスクリプト:

#!/usr/bin/Perl

use strict;
use warnings;

my $t = $ARGV[0];
my $l = qr/$ARGV[1]/;

while(<DATA>) {
    if (/${l}_/) {
        if (/_(.*?)\./) {
            print if $1 gt $t;
        }
    }
}

__DATA__
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
2
cuonglm

Awk(mawk 1.3.3) 解決:

ls | awk -F'[_.]' '{printf "%s_%s\n", $2, $3}' | \
awk ' $0 > "2014-05-28_15:08:00" {print}'

与える:

2014-05-28_15:08:01
2014-05-28_15:08:09
2014-05-28_15:08:10
2014-05-28_15:08:11
2014-05-28_15:08:12
2014-05-28_15:08:13
2014-05-28_15:08:14
2014-05-28_15:08:22
2
chaos

sortは、ここで作業の大部分を実行できます。

jobname=job
timestamp=2014-05-28_15:08:00
param=${jobname}_${timestamp}.log
printf %s\\n "${param}" ./* |
sort -t_ -r -k1,1 -k2,2n -k3,3n |
sed -n "\|./${jobname}_|{/${param}/q;p}"

###OUTPUT:

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

そして2番目の例:

jobname=job1
timestamp=2014-05-28_15:08:11
param=${jobname}_${timestamp}.log
printf %s\\n "${param}" ./* |
sort -t_ -r -k1,1 -k2,2n -k3,3n |
sed -n "\|./${jobname}_|{/${param}/q;p}"

###OUTPUT:

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

-cnewerをfindで使用できます。

find /mylogdir -name "job_*" -cnewer /mylogdir/job1_2014-05-28_15:08:00.log

もちろん、これは、ファイル名に基づいていない、実際に変更されたファイル、またはjob1_2014-05-28_15:08:00.logの後にメタデータが変更されたファイルを検索することです。あなたの場合、これはうまくいくはずです。

0
Jeight