我遇到了 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)对它们进行索引,即进行删除操作。