web-dev-qa-db-ja.com

BASH連想配列再配置キー

Bashの連想配列で奇妙な問題が発生しています。

ディレクトリに次のファイルがあります。

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 .

ファイルは古いものから新しいものへとリストされます。

-次のコマンドを使用して、ls-lartの出力をファイルに送信しました。

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

filestodel.txtには、古いものから新しいものへのファイルのリスト(関連するサイズ)があります。

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

ここで、最初の列にはファイルの名前があり、2番目の列にはサイズ(キロバイト単位)があります。

-配列を定義し、これらのエントリを配列にプッシュします。

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

アイデアは、配列にリストされているファイルを最も古い(最初の)ものから最も新しいものに削除することです。これは、上記のls-lart出力に従ってファイル1.txtの削除を開始することを意味します。

問題は、キーをループするときです。

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

私はこの出力を取得します:

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

明らかにめちゃくちゃです!

配列内のファイルの元の順序を維持するにはどうすればよいですか?

ありがとう、dom

2
dev-dom

2つの配列が必要で、最初のパスで番号でインデックスを付けます。最初は名前を受け取り、2番目はサイズを受け取ります。次に、削除を行うときに、2番目のパスで再度番号(0からnumber_of_files-1)でインデックスを付けます。

0
ilkhd