Transformar lista de arquivos (com data) na lista de datas

0

Eu tenho um diretório onde eu armazeno backups. Eles estão no formato Complete Backup YYYY-MM-DD hh-mm-ss.tar.bz2 Descobri que você pode alimentar uma data no comando date usando date --date="YY-MM-DD hh:mm:ss" .

Então, como eu obteria uma lista de datas separadas por espaço? As datas devem ter passado por uma chamada de date para que sejam formatadas.

Eu criei este comando que me dá uma lista (uma entrada por linha) no formato YYYY-MM-DD hh-mm-ss . Então, como formatá-lo corretamente e marcar uma data em cada um deles e separá-los com um espaço?

dir backups/ | grep '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\ [0-9][0-9]-[0-9][0-9]-[0-9][0-9]\.tar\.bz2$' | sed 's/\//g' | sed 's/\.tar\.bz2//g' | sed 's/Complete Backup //g'

Nota: A saída será usada em um loop de seleção para que todos os espaços pertencentes a uma data sejam escapados.

    
por BrainStone 28.08.2013 / 23:28

2 respostas

2

O seguinte irá reformatar as datas:

dir -1 backups | awk '/Complete\ Backup\ .*\.tar\.bz2/ { gsub(/\/, ""); sub(/Complete Backup /, ""); sub(/.tar.bz2/, ""); gsub(/-/, " "); print strftime("%c", mktime($0)); }'

E aqui está uma maneira de colocar isso em um select:

OIFS="$IFS"; IFS=$'\n'; set -- $(dir -1 backups | awk '/Complete\ Backup\ .*\.tar\.bz2/ { gsub(/\/, ""); sub(/Complete Backup /, ""); sub(/.tar.bz2/, ""); gsub(/-/, " "); print strftime("%c", mktime($0)); }'); IFS="$OIFS"
select date in "$@"; do echo "$date"; done

Aqui está uma versão que classifica as datas:

OIFS="$IFS"
IFS=$'\n'

set -- $(
    dir -1 backups |
    awk '/Complete\ Backup\ .*\.tar\.bz2/ \
         {
            gsub(/\/, "");
            sub(/Complete Backup /, "");
            sub(/.tar.bz2/, "");
            gsub(/-/, " ");
            VAL[NR] = mktime($0);
         }

         END \
         {
            for ( i = asort(VAL); i > 0; i-- )
            {
                    print strftime("%a %b %d %T %Z %Y", VAL[i]);
            }
         }'
    )

IFS="$OIFS"

select date in "$@"
do
    echo "$date"
done
    
por 29.08.2013 / 00:42
1

Aqui você vai:

dates=($(for i in backups/*.tar.bz2;do #Glob eliminates need to list all files
             date=${i/Complete Backup /} #Remove "Complete Backup "
             date=${date%%.*} #Remove ".tar.bz2"
             date=${date/ /,} #Substitue , for space
             echo $date #Echo the date for sed
         done|sed -e 's/\([0-9]\+\)-\([0-9]\+\)-\([0-9]\+\)$/::/'|sort -r|xargs echo))
select date in ${dates[@]};do
    echo "$date"
done

Mais uma coisa: se você estiver usando isso para um loop select , como você vai diferenciar as diferentes datas quando elas estão separadas por espaços? Quero dizer que você usa espaço para separar a data da hora também, então isso pode ser uma fonte de confusão.

Editar

  • Adicionada a classificação das datas do mais recente para o mais antigo, pois seus comentários indicam que você precisa deles classificados dessa maneira.
  • Adicionado código para separar data e hora por uma vírgula para que select possa informar um par de data e hora de uma nova entrada.
  • Envolveu o todo em um select loop Armazenou as datas em uma matriz que será então iterada por um loop select para evitar a necessidade de analisar novamente as datas de cada repetição do loop .
por 29.08.2013 / 01:07