我有多个目录,我想为每个目录列出按扩展名分组的文件总数,如下所示:
/Documents
2 zip 20 M
3 tar 50 M
5 png 10 K
/Desktop
5 txt 10 K
7 png 5 M
10 jpg 5 M
以下脚本是我的方法,但是其输出与我期望的不同:
#!/bin/bash
find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do
num=$(find $dir find . -type f | sed -n 's/..*\.//p' | sort | uniq -c);
printf "%5d files in directory %s\n" "$num" "$dir";
done
脚本输出:
7 csv
1 csv#
2 doc
1 docx
9 html
24 jpg
33 js
20 mp3
2 mp4
9 pdf
101 png
3 ppt
128 swf
3 xml
4 xsd
26 zip
答案 0 :(得分:0)
从您的脚本中,我得到的想法是您只想深入一层。所以,为什么不尝试这样的事情:
for dir in * ; do
if [ -d "$dir" ] ; then
echo "$dir"
extlist=`ls $dir | sed 's/.*\.//' | uniq`
for ext in $extlist ; do
qty=`qty=`ls "$dir/*$ext"| wc -l`
space=`du -ch "$dir/*$ext"| sed -n 's/ *total//p'`
echo "$qty $ext $space"
done
fi
done
答案 1 :(得分:0)
这是你的追求吗?
$ mkdir Desktop Documents
$ for d in D*; do for e in zip jpg foo; do for i in $(seq 1 $((RANDOM/3000))); do touch $d/$i.$e; done; done; done
$ declare -A a; for d in D*; do a=(); for f in $d/*.*; do (( a[${f##*.}]++ )); done; printf '%s: ' "$d"; declare -p a; done;
Desktop: declare -A a=([jpg]="3" [foo]="5" [zip]="3" )
Documents: declare -A a=([jpg]="6" [foo]="2" [zip]="2" )
您可以在外循环的每次迭代结束时,根据需要解析计数数组。