Filesystems

在shell中按副檔名計算總文件大小

  • April 12, 2020

我們有一組包含 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 的各種組合,但發現要做到這一點很棘手。

對於您使用的任何給定擴展

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

它將輸出找到的每種文件類型的大小(以字節為單位)。

使用 bash version4,您只需要呼叫findls而不awk需要:

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

引用自:https://serverfault.com/questions/367185