BASH 关联数组重新排列键

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

第一列为文件的名称,第二列为大小(以 KB 为单位)

-我定义一个数组并将这些条目推入其中:

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

这个想法是删除数组中从最旧(第一个)到最新的列出的文件,这将转化为开始删除文件 1.txt,按照上面的 ls -lart 输出。

问题是,当我循环遍历键时:

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

我得到这个输出:

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

这显然是搞乱了!

我如何才能保持数组中文件的原始顺序?

谢谢,dom

答案1

您需要 2 个数组,在第一次传递时用数字对它们进行索引:第一个数组接收名称,第二个数组接收大小;然后在第二次传递时再次用数字(从 0 到文件数 - 1)对它们进行索引,即进行删除操作。

相关内容