在 shell 中按扩展名计算文件总大小

在 shell 中按扩展名计算文件总大小

我们有一组包含 lucene 索引的目录。每个索引都是不同文件类型的混合(按扩展名区分),例如:

0/index/_2z6.frq
0/index/_2z6.fnm
..
1/index/_1sq.frq
1/index/_1sq.fnm
..

(大约有 10 种不同的扩展)

我们想要按文件扩展名获取总数,例如:

.frq     21234
.fnm     34757
..

我尝试过 du/awk/xargs 的各种组合,但发现要做到这一点很棘手。

答案1

对于任何给定的扩展,您可以使用

find /path -name '*.frq' -exec ls -l {} \; | awk '{ Total += $5} END { print Total }'

获取该类型的文件总大小。

经过一番思考

#!/bin/bash

ftypes=$(find . -type f | grep -E ".*\.[a-zA-Z0-9]*$" | sed -e 's/.*\(\.[a-zA-Z0-9]*\)$/\1/' | sort | uniq)

for ft in $ftypes
do
    echo -n "$ft "
    find . -name "*${ft}" -exec ls -l {} \; | awk '{total += $5} END {print total}'
done

这将输出找到的每种文件类型的字节大小。

答案2

使用 bash 版本 4,你只需要调用findlsawk没有必要:

declare -A ary

while IFS=$'\t' read name size; do 
  ext=${name##*.}
  ((ary[$ext] += size))
done < <(find . -type f  -printf "%f\t%s\n")

for key in "${!ary[@]}"; do 
  printf "%s\t%s\n" "$key" "${ary[$key]}"
done

答案3

每隔一列分割.,最后一部分(扩展)保存在数组中。

#!/bin/bash

find . -type f -printf "%s\t%f\n" | awk '
{
 split($2, ext, ".")
 e = ext[length(ext)]
 size[e] += $1
}

END{
 for(i in size)
   print size[i], i
}' | sort -n

然后你就得到了每个扩展的总大小(以字节为单位)。

60055 gemspec
321991 txt
2075312 html
2745143 rb
13387264 gem
47196526 jar

答案4

这是解决方案:

find . -type f | grep -E ".*\.[a-zA-Z0-9]*$" | sed -e 's/.*\(\.[a-zA-Z0-9]*\)$/\1/' | sort | uniq -c | sort -n

解决方案最初发布在这篇文章上:获取目录中的所有扩展及其各自的文件数

相关内容