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
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?
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
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
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
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.
Tags command-line time date linux timestamps