pesquisa o nome do arquivo mais recente

0

Estou escrevendo um script bash para procurar um arquivo que tenha nome de arquivo mais recente e um nome de arquivo como:

...
Wed_Dec_30_16:47:41_PHT_2015.zip
Wed_Dec_30_16:00:41_PHT_2015.zip
Wed_Dec_30_16:00:41_PHT_2015.zip
Thu_Dec_31_16:49:14_PHT_2015.zip
...

Eu estou procurando todo o arquivo .zip use o comando find e eu pensei que talvez eu precisasse de um array como:

readarray -t lines <<< "$(find . -type f -name '*.zip' -exec basename {} \;|tr -d '[.zip]'|tr '_' ' ')"
len=${#lines[@]}
for ((i=0;i<len;i++)); do
    echo ${lines[$i]}
done

E eu tenho todo o nome do arquivo (com data e hora) como este no terminal. parece completamente:

Wed Dec 30 16:47:41 PHT 2015
Wed Dec 30 16:00:35 PHT 2015
Thu Dec 31 12:14:13 PHT 2015
Thu Dec 31 12:19:34 PHT 2015
Wed Dec 30 16:49:14 PHT 2015
Thu Dec 31 13:01:11 PHT 2015
Mon Dec 28 12:35:44 PHT 2015
...

Mas, não sei como posso comparar esses muitos string ao usar date .

E, com certeza, não tenho certeza se essa é uma maneira realmente correta de reverter o arquivo, que é uma string como Wed Dec 30 16:49:14 PHT 2015 to Wed_Dec_30_16:49:14_PHT_2015.zip

Obrigado pela ajuda.

Editar:

Eu corrijo meu script e faço a comutação 'string' para 'date', que é o segundo nível:

declare -a my_array
len=${#lines[@]}
for ((i=0;i<$len;i++));do
    my_array[$i]='date -d "${lines[$i]}" +%s'
done

e escolha o máximo:

max=${my_array[0]}
for((i=0;i<$len;i++));do
    if [ ${my_array[$i]} -gt $max ];then max=${my_array[$i]};fi
done
echo $max

terminal:

1451465261
1451462435
1451535253
1451535574
1451465354
1451538071
1451277344
1451538071 <== max one

Então, devo reverter como: Wed_Dec_30_16:00:41_PHT_2015.zip ?

Alguém tem um jeito simples?

    
por Se ven 19.01.2016 / 09:09

2 respostas

0

Com o gnu sort tendo input.txt como entrada (< a href="http://explainshell.com/explain?cmd=sort%20-t%20_%20-k6n%2C6.4%20-k2M%20-k3n%20-k4.1n%2C4.2% 20-k4.4n% 2C4.5% 20-k4.7n% 2C4.8 "> explicar ):

cat input.txt | sort -t _ -k6n,6.4 -k2M -k3n -k4.1n,4.2 -k4.4n,4.5 -k4.7n,4.8

Adicione --debug flag para ver os campos usados para classificação. Útil quando você tem que ajustar substrings:

Wed_Dec_30_16:00:41_PHT_2015.zip
                        ____
    ___
        __
           __
              __
                 __
    
por 19.01.2016 / 09:56
0

Eu sei que você tem seus dados em uma matriz, mas testei com um arquivo. Não importa - a lógica é a mesma. Basta converter em segundos desde a época, testar qual número de época é maior e lembrar esse número - essa é a data mais recente. Então, obviamente, você precisa reconciliar essa cadeia com as estruturas de arquivos para obter o arquivo específico que estava procurando.

arquivo: dates.txt

Wed Dec 30 16:47:41 PHT 2015
Wed Dec 30 16:00:35 PHT 2015
Thu Dec 31 12:14:13 PHT 2015
Thu Dec 31 12:19:34 PHT 2015
Wed Dec 30 16:49:14 PHT 2015
Thu Dec 31 13:01:11 PHT 2015
Mon Dec 28 12:35:44 PHT 2015

arquivo: find_latest.sh

#!/usr/bin/env bash

newest=0

while read line
do
    i=$(awk '{print $1" "$2" "$3" "$4" "$6}' <<<$line)
    epoch=$(date --date="$i" +'%s')
    if [ "$epoch" -gt "$newest" ]
    then
        newest=$(date --date="$i" +"%s")
    fi

done < dates.txt

echo "newest is: "$(date --date="@${newest}")

resultado:

newest is: Thu Dec 31 13:01:11 NZDT 2015
    
por 19.01.2016 / 09:44