2
size=`ls -l /var/temp.* | awk '{ print $5}'`
        fin_size=0
        for row in ${size} ;
        do      
                 fin_size=`echo $(( $row + $fin_size )) | bc`;
        done
echo $fin_size

動かない !!echo $fin_sizeガベージマイナス値を投げています。私はどこを間違えていますか?(私の bash は古く、Linux カーネル 2.6.39 のみで動作すると思われます)

4

3 に答える 3

2

解析しないでくださいls

du以下に示すように使用しないのはなぜですか?

du -cb /var/temp.* | tail -1 
于 2013-05-13T07:51:07.500 に答える
1

十分に強調できないため: ls(1) の出力を解析してはならない理由

たとえばdu、dogbane で提案されているように使用するか、次のように使用しfindます。

$ find /var -maxdepth 1 -type f -name "temp.*" -printf "%s\n" | awk '{total+=$1}END{print total}'

またはstat:

$ stat -c%s /var/temp.* | awk '{total+=$1}END{print total}'

またはグロビングおよびstat(不要、遅い):

total=0
for file in /var/temp.*; do
    [ -f "${file}" ] || continue
    size="$(stat -c%s "${file}")"
    ((total+=size))
done
echo "${total}"
于 2013-05-13T11:01:58.340 に答える
-1

以下で十分です。

ls -l /var/temp.*  | awk '{a+=$5}END{print a}'

for ループを実行する必要はありません。これは次のことを意味します。

size=ls -l /var/temp.* | awk '{ print $5}'`
        fin_size=0
        for row in ${size} ;
        do      
                 fin_size=`echo $(( $row + $fin_size )) | bc`;
        done
echo $fin_size

上記のすべてを次のように置き換えることができます。

fin_size=`ls -l /var/temp.*  | awk '{a+=$5}END{printf("%10d",a);}'`
echo $fin_size
于 2013-05-13T07:06:47.953 に答える