通过脚本的这一部分,我可以获得有关目录(和子目录)中文件的必要信息。我唯一需要的信息是文件的扩展名和大小。
for file in `find . -type f`; do
size=$(stat -c '%s' ${file})
file=$(echo "${file}" | awk -F/ '{print $NF}')
ext=$(echo "${file}" | grep '..*\.' | awk -F. '{print $NF}' | grep '[A-Za-z0-9]')
if [ -z ${ext} ]; then
echo "NOTE: no extention"
else
EXTS="${EXTS}${ext}${newLine}"
它只是脚本的一部分。所以我的问题是:如何将这个信息放入数组中?我的意思是我想要一个包含元素的数组看起来像这样:
c/123 /12 h/90 /0 txt/0
其中c,h和txt是文件扩展名,123、12和0是文件大小。因此,最近我可以分别使用大小和扩展名
,希望我已经将问题巧妙地解决了。对不起,错了。:)
首先,不要做for file in $(find …)
。那是非常脆弱的。
现在,您可以使用-printf
以下命令找到一起打印文件名和大小的方法,从而稍微简化代码:
find . -type f -printf '%s.%f/'
然后,您可以使用awk
来处理此输出,以按扩展名获取累积大小。请注意,我过去通常.
将文件名(%f
)和大小(%s
)分开,并在/
其后添加了一个。因此,我可以.
在中用作字段分隔符awk
。由于文件名中唯一不允许使用的字符是/
ASCII NUL,因此我可以放心/
用作记录分隔符。
所以:
awk -F. -v RS=/ 'NF > 2 {size[$NF] += $1; next}
{size["/"] += $1}
END {for (i in size) {print i,"/",size[i]}'
在这里,/
如果没有扩展名,我将用作索引。
合并:
$ find . -type f -printf '%s.%f/' | awk -F. -v RS=/ 'NF > 2 {size[$NF] += $1; next}
{size["/"] += $1}
END {for (i in size) {printf "%s/%d\n", i, size[i]}}'
h/780
md/2509
tex/23961
c/13557
//5109
txt/2349291
sh/1166
py/12248
现在,如果您的扩展名不包含空格,则可以执行以下操作:
my_array=( $(find . -type f -printf '%s.%f/' | awk -F. -v RS=/ 'NF > 2 {size[$NF] += $1; next} {size["/"] += $1} END {for (i in size) {printf "%s/%d\n", i, size[i]}}') )
或者,您可以使用流程替换并读取以下各项中的每个条目:
my_arr=()
while IFS='' read -r entry
do
my_arr+=( "$entry" )
done < <(find . -type f -printf '%s.%f/' | awk -F. -v RS=/ 'NF > 2 {size[$NF] += $1; next} {size["/"] += $1} END {for (i in size) {printf "%s/%d\n", i, size[i]}}')
像之前一样:
$ printf "%s\n" "${my_arr[@]}"
h/780
md/2509
tex/23961
c/13557
//5109
txt/2349291
sh/1166
py/12248
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句