Precisa obter o arquivo mais recente com data e hora para cada mês

1

Estou apenas começando com a programação do Unix e tenho um requisito. Eu tenho quatro arquivos que são colocados na minha zona de pouso e eu preciso do agendador para pegar o arquivo mais recente daquele mês e ano.

Por exemplo:

FILE_NR_WEEKLY_01_20130528_CHARGE

FILE_NR_WEEKLY_01_20130530_CHARGE--> This needs to be picked 1st for may month

FILE_NR_WEEKLY_01_20130601_CHARGE

FILE_NR_WEEKLY_01_20130604_CHARGE -->This needs to be picked up for June month

No caso acima para a combinação de ano, mês e data, preciso de obter o arquivo mais recente.

    
por user40511 05.06.2013 / 03:07

2 respostas

2

No trecho que você deu, isto:

ls -r | POSIXLY_CORRECT=1 awk '
  match($0,"20[0-9]{6}") && !n[substr($0,RSTART,6)]++'

funcionaria. O POSIXLY_CORRECT=1 é necessário apenas com o GNU awk , que não reconhece {6} (não prejudica outras implementações awk ).

Com o GNU sort , que garante um tipo estável ,

ls -r | sort -ut_ -k 5,5.6

também funcionaria (espera a data no quinto campo).

    
por 05.06.2013 / 16:46
0

Se você sabe que está interessado apenas nos meses de um ou dois anos (digamos 2012 e 2013), e se você sabe que o arquivo do último mês é mais recente que o anterior meses (quero dizer, se o arquivo para janeiro foi criado antes o arquivo para fevereiro, etc), então você pode usar o carimbo do tempo do arquivo para encontrar o mais novo para cada ano e mês, apenas classificar os arquivos por data ( ls -tr ) e selecione o último arquivo ( tail -n 1 ):

for year in 2012 2013; do for month in {1..12}; do 
   file='ls -tr *$year*$month??_* | tail -n 1' && 
   if [ -f "$file" ]; then echo "$year/$month $file";fi;
   done;done 2>/dev/null 

Se você não souber que o arquivo "mais recente" é o mais novo, será necessário analisar seus nomes:

find . -type f | perl -ne 'chomp; /_(\d{4})(\d{2})(\d{2})_/; 
    $newest{$1}{$2}=$_ if $3>$newest{$1}{$2}; 
    END{
       foreach $year (keys(%newest)){
         foreach $month (keys %{$newest{$year}}){
           print "$year/$month\t$newest{$year}{$month}\n"
        } } }' | sort
    
por 05.06.2013 / 04:36