array associativo BASH reorganiza chaves

2

Estou me deparando com um problema estranho com matrizes associativas no bash.

Eu tenho os seguintes arquivos em um diretório:

ls -lart
drwxr-xr-x. 3 root root 4096 Feb  9 11:14 ..
-rw-r--r--  1 root root 3275 Feb  9 14:16 1.txt
-rw-r--r--  1 root root 3275 Feb  9 14:16 2.txt
-rw-r--r--  1 root root 3275 Feb  9 14:16 3.txt
-rw-r--r--  1 root root    0 Feb 12 15:19 a.txt
-rw-r--r--  1 root root    0 Feb 12 15:19 123.txt
drwxr-xr-x  2 root root 4096 Feb 12 15:19 .

Os arquivos são listados do mais antigo para o mais recente.

-Enviou a saída de ls -lart para um arquivo com o seguinte comando:

ls -lart --block-size=K /test |grep txt |awk '{print $9,$5}'  > /tmp/filestodel.txt

filestodel.txt tem a lista de arquivos (com tamanho associado) do mais antigo ao mais recente:

   cat /tmp/filestodel.txt
    1.txt 4K
    2.txt 4K
    3.txt 4K
    a.txt 0K
    123.txt 0K

onde a primeira coluna tem o nome do arquivo e a segunda o tamanho (em Kbytes)

-Eu defino uma matriz e insiro essas entradas:

declare -A cleanup
while read line
    do
    filetodelname=$(echo $line | awk {'print$1'});
    filetodelsize=$(echo $line | awk {'print$2'});
    cleanup[$filetodelname]=$filetodelsize
    done < /tmp/filestodel.txt

a idéia é deletar os arquivos listados no array do mais antigo (primeiro) ao mais novo, o que se traduziria em começar a deletar o arquivo 1.txt conforme a saída ls -lart acima.

A questão é que quando eu percorro as chaves:

for K in "${!cleanup[@]}"; do echo $K; done   #print filenames

Eu recebo esta saída:

2.txt
3.txt
123.txt
1.txt
a.txt

que está claramente confuso!

Como posso manter a ordem original dos arquivos na matriz?

Obrigado dom

    
por dev-dom 13.02.2015 / 00:59

1 resposta

0

Você precisaria de 2 arrays, indexe-os por um número no primeiro passo: primeiro receberá nomes, segundos tamanhos; em seguida, indexe-os por um número (de 0 a number_of_files - 1) novamente na segunda passagem, ao fazer as exclusões.

    
por 13.02.2015 / 01:42