曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3776|回复: 0
打印 上一主题 下一主题

统计某个目录下所有文件类型的文件个数

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2012-3-30 17:38:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面代码统计某目录下所有的文件类型相对应的文件个数,代码如下:
[Bash shell] 纯文本查看 复制代码
#!/bin/bash

if [ $# -ne 1 ];
then
    echo $0 you_ path;
    echo
fi

path=$1

declare -A statarray;

while read line;
do
    ftype=`file -b "$line" | cut -d, -f1`
        #echo $ftype | grep "[0-9][0-9]-bit" &> /dev/null
    #if [ $? -eq 0 ];
    #then
    #    ftype=`echo $ftype | awk -F, '{print $1}'`
    #fi    
    let statarray["$ftype"]++;

done< <(find $path -type f -print)

#echo ======================File types and counts======================

for ftype in "${!statarray[@]}";
do
    echo $ftype : ${statarray["$ftype"]}
done

运行输出:
$ ./stat.sh ./
Bourne-Again shell script text executable : 5
Vim swap file : 2
ELF 32-bit LSB executable : 1
ASCII text : 6
ASCII C program text : 3
在上面代码中,主要利用 find 命令在指定目录下查找相应文件,然后使用 file 命令获取文件类型,其中 file 命令的 -b 选项是一种简略的输出,它忽略了文件名,而只输出该文件的类型说明,然后将这些文件类型说明信息作为关联数组 的索引以便在循环读取中统计。

在循环读取中,需要注意 done< <(find $path -type f -print) 这种用法,它可以简写成下面的形式:
while read line;
do something
done< filename
注意 (find $path -type f -print) 的前面也有一个 < 符号。

另外,对于可执行的 ELF 文件,file -b 会输出所有的详细信息,因此需要使用 cut 命令来进行截取。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-15 19:59 , Processed in 0.075515 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表