将文件名和大小放入数组中

时间:2014-08-12 15:02:59

标签: linux bash shell

我正在尝试将文件名和大小放入数组中,以便我可以在for语句中对它们进行比较: 我有以下代码:

list=( $( ls -al *.gz |awk '{print $9, $5}' |grep 2014-08-12 ) )
for line in ${list[@]}
  do
    echo "0="${line[0]}
    echo "1="${line[1]}
done

但结果是:

0=2014-08-12.tar.gz
1=
0=50265
1=
0=2014-08-12.tar.gz
1=
0=693766
1=

结果应该是:

0=2014-08-12.tar.gz
1=50265
0=2014-08-12.tar.gz
1=693766

我做错了什么?

3 个答案:

答案 0 :(得分:3)

您必须避免解析ls输出。要存储文件大小和文件名,请使用stat命令:

sizes=()
names=()
for i in *.gz; do
    sizes+=( $(stat -c "%s" "$i") )
    names+=( "$(stat -c "%n" "$i")" )
done

答案 1 :(得分:3)

statread循环一起使用:

while read -r size file; do
    echo -e "0=$file\n1=$size"
done < <(stat -c "%s %n" *.gz)

使用Awk:

awk '{print "0="substr($0,index($0,$2))"\n1="$1}' < <(stat -c "%s %n" *.gz)

答案 2 :(得分:0)

迭代线性列表的一种正确方法是

for (( i = 0; i < ${#list[@]}; i += 2 )); do
    echo "0=${line[i]}"
    echo "1=${line[i + 1]}"
done

或者只是

for (( i = 0; i < ${#list[@]}; i += 2 )); do
    printf '0=%s\n1=%s\n' "${line[i]}" "${line[i + 1]}"
done