如何收集大量的文件并且收集到所有文件的详细信息的脚本,是这一章的主要内容
find命令可以通过查看文件的内容来找出特定的类型的文件,在UNIX/Linux系统中,这个文件类型并不是交由文件的扩展名决定的,而是交由特定类型来确定的
我们使用file filename来打印文件类型信息
file /tmp/1.txt
/tmp/1.txt: empty
打印不包括文件名在内的文件类型信息
file -b filename
empty
那么获取文件详细信息的脚本如下
#!/bin/bash
if [ $# -ne 1 ]; then echo $0 basepath; echo; fi path=$1 declare -A statarray; while read line; do ftype=`file -b $line` let statarray[“$ftype”]++; done< <(find $path -type f -print) echo ========= File types and counts ========= for ftype in “${!statarray[@]}”; do echo $ftype : ${statarray[“$ftype”]} done |
用法很简单
./filestat.sh /tmp
简单的输出如下
========= File types and counts =========
Bourne-Again shell script, ASCII text executable : 2
data : 2
empty : 1
ASCII text, with very long lines : 1
上面的脚本如何实现?
我们首先声明了一个关联数组 statarray,可以存储文件类型,那么每种文件类型,都会存进去,每次遇到一个文件类型,就用let增加计数
find命令以一种递归的方式获取到了文件路径
file -b 命令只打印文件类型信息
然后进行存入
最后进行循环输出,并且用逗号进行分割
还有就是find过程配合的done指令
这样搭配下来
执行逻辑会变成
while read line;
do something
done < filename
我们不用filename,而是使用了find命令的输出
我们使用了子进程来代替文件名
${! statarray[@]} 用于返回一个数组的索引列表