我正在尝试将文件名和大小放入数组中,以便我可以在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
我做错了什么?
答案 0 :(得分:3)
您必须避免解析ls
输出。要存储文件大小和文件名,请使用stat
命令:
sizes=()
names=()
for i in *.gz; do
sizes+=( $(stat -c "%s" "$i") )
names+=( "$(stat -c "%n" "$i")" )
done
答案 1 :(得分:3)
将stat
与read
循环一起使用:
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