Bash: Ordenar elementos da matriz por data de arquivo [duplicado]

0

Eu tenho um script Bash que tem um array chamado myarray.

Esta matriz contém caminhos completos de localização de arquivos para 4 arquivos.

O que estou tentando fazer é classificar os elementos da matriz na data de criação do arquivo.

Então, apenas como um exemplo rápido, se eu tiver os seguintes 4 arquivos na matriz:

/tmp/file1.txt (in index 0)
/tmp/test/file1.txt (in index 1)
/tmp/test1/file1.txt (in index 2)
/tmp/test2/file1.txt (in index 3)

... e o arquivo no índice 2 tem data de criação mais recente e os outros, ele deve ser classificado no índice 1 e assim por diante.

Originalmente, pensei no seguinte:

myarray=($(for each in ${myarray[@]}; do echo $each; done | sort -n))

Mas se eu olhar para o conteúdo da matriz, não vejo o arquivo mais novo no índice 0.

Alguém saberia de uma maneira de conseguir isso em bash?

    
por Rylic718 13.01.2017 / 21:59

1 resposta

2

O seguinte classifica os arquivos pela data de modificação, já que a data de criação não é suportada no sistema em que testei o script. A substituição de %Y por %W deve produzir o tempo de criação, se suportado.

#! /bin/bash
files=(*.txt)
while IFS= read -r line ; do
    sorted+=("$line")
done < <(
    for f in "${files[@]}" ; do
        echo $(stat -c %Y -- "$f")$'\t'"$f"
    done | sort -nk1,1 | cut -t $'\t' -f2-
)

echo "${sorted[@]}"

Funciona para arquivos com espaços em seus nomes. Nomes de arquivo contendo novas linhas podem quebrá-lo, mas você não usa novas linhas em nomes de arquivos, certo?

    
por 13.01.2017 / 22:41