Listar arquivos maiores que timestamp em nome de arquivo?

3

Eu tenho um diretório em linux que tem uma lista de arquivos de log onde os arquivos de log são gerados automaticamente se algum trabalho for executado. Cada arquivo de log é anexado com o timestamp como " JobName_TimeStamp "

ATUALIZADO:

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

Eu queria executar um comando linux para listar todos os arquivos maiores que um timestamp em particular?

Para o exemplo 1 : transmitirei dois parâmetros, se o TimeStamp fornecido for " 2014-05-28_15: 08: 00 " e Nome do trabalho é " trabalho "

Eu deveria pegar a lista como

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

Exemplo 2 : passarei dois parâmetros, se o TimeStamp fornecido for " 2014-05-28_15:08:11 " e Nome do trabalho for " job1 "

Eu deveria pegar a lista como

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

Alguma solução?

    
por Kabilan 28.05.2014 / 12:06

5 respostas

2

O código abaixo funcionou:

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

Uma solução de awk ( mawk 1.3.3 ):

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

Dá:

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
    
por 28.05.2014 / 12:42
2

Uma solução 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

Atualizar

Um script simples de 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
    
por 28.05.2014 / 12:21
1

sort pode fazer a maior parte do trabalho aqui:

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

E o segundo exemplo:

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
    
por 28.05.2014 / 22:56
0

Você pode usar -cnewer com find:

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

Claro, isso é encontrar arquivos que foram realmente modificados ou tiveram seus metadados modificados após job1_2014-05-28_15:08:00.log e não baseados nos nomes dos arquivos. No seu caso, isso deve funcionar bem.

    
por 28.05.2014 / 21:55