在bash shell中添加文件大小

时间:2014-02-03 16:47:17

标签: bash file shell loops add

我编写了一个shell脚本,它将目录作为arg并打印文件名和大小,我想知道如何添加文件大小并存储它们以便我可以在循环后打印它们。我已经尝试了一些东西,但到目前为止还没有任何进展,任何想法?

#!/bin/bash

echo "Directory <$1> contains the following files:"
let "x=0"
TEMPFILE=./count.tmp
echo 0 > $TEMPFILE
ls $1 |
while read file
do
        if [ -f $1/$file ]
        then
                echo "file: [$file]"
        stat -c%s $file > $TEMPFILE
        fi
cat $TEMPFILE
done
echo "number of files:"
cat ./count.tmp

将非常感谢帮助。

3 个答案:

答案 0 :(得分:4)

您的代码中存在许多问题:

假设你只是想在这方面练习和/或想要做除以外的其他事情,你应该将语法改为

#!/bin/bash

dir="$1"
[[ $dir == *'/' ]] || dir="$dir/"
if [[ -d $dir ]]; then
  echo "Directory <$1> contains the following files:"
else
  echo "<$1> is not a valid directory, exiting"
  exit 1
fi

shopt -s dotglob
for file in "$dir"*; do
  if [[ -f $file ]]; then
    echo "file: [$file]"
    ((size+=$(stat -c%s "$file")))
  fi
done

echo "$size"

注意:

  • 您不必在bash中预先分配变量,$size假定为0
  • 您可以将(())用于不需要小数位的数学。
  • 您可以使用globs(*)获取特定目录中的所有文件(包括dirs,符号链接等)(以及globstar **的递归)
  • shopt -s dotglob是必需的,因此它在glob匹配中包含隐藏的.whatever文件。

答案 1 :(得分:2)

您可以使用ls -l查找文件大小:

echo "Directory $1 contains the following:"
size=0
for f in "$1"/*; do
    if [[ ! -d $f ]]; then
        while read _ _ _ _ bytes _; do
            if [[ -n $bytes ]]; then
                ((size+=$bytes))
                echo -e "\tFile: ${f/$1\//} Size: $bytes bytes"
            fi
        done < <(ls -l "$f")
    fi
done
echo "$1 Files total size: $size bytes"

解析ls结果的大小是正确的,因为字节大小总是会在第5个字段中找到。

如果您知道系统上ls的日期戳格式是什么,并且可移植性不重要,您可以解析ls以在单个{{1}中可靠地找到大小和文件循环。

while read

注意:这些解决方案不包含隐藏文件。请使用echo "Directory $1 contains the following:" size=0 while read _ _ _ _ bytes _ _ _ file; do if [[ -f $1/$file ]]; then ((size+=$bytes)) echo -e "\tFile: $file Size: $bytes bytes" fi done < <(ls -l "$1") echo "$1 Files total size: $size bytes"

根据需要或偏好,ls -la还可以使用ls-h等选项以多种不同格式打印尺寸。

答案 2 :(得分:0)

#!/bin/bash

echo "Directory <$1> contains the following files:"

find ${1}/* -prune -type f -ls | \
    awk '{print; SIZE+=$7} END {print ""; print "total bytes: " SIZE}'

使用查找 -prune (因此它不会递归到子目录中)和 -type f (因此它只会列出文件和没有符号链接或目录)和 -ls (所以它列出了文件)。

将输出传输到awk和

每行打印整行( print ;替换为print $NF仅打印每行的最后一项,即包含目录的文件名)。还要将第7个字段的值添加到变量SIZE中,即文件大小(在我的find版本中)。

处理完所有行后( END ),打印计算出的总大小。