如何在Linux中获取分组文件的总数以及扩展名和路径

时间:2018-07-25 12:42:59

标签: linux bash

我有多个目录,我想为每个目录列出按扩展名分组的文件总数,如下所示:

/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

2 个答案:

答案 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" )

您可以在外循环的每次迭代结束时,根据需要解析计数数组。