如何收集大量的文件并且收集到所有文件的详细信息的脚本,是这一章的主要内容

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[@]} 用于返回一个数组的索引列表

发表评论

邮箱地址不会被公开。 必填项已用*标注