目录树文件名映射深度1分组计数,tree(映射(目录A))
#!/bin/bash
#【描述】 目录树文件名映射深度1分组计数,tree(映射(目录A))
#【术语】
# agg==aggregate==聚合==统计==按照mime-type分组
# FN==FileName==文件名
#【基本思路】
# 0. linux gnu tree命令的优点: 目录结构树展示的很友好. 而且 单独做一个同样的展示效果 并不容易
# 1. tree命令的不支持点
# 不支持对叶子节点(文件)的映射(比如映射文件到扩展名)
# 不支持对目录节点的映射(比如目录下的扩展名分组统计)
# 2. 先对目录A做映射(扩展名,扩展名分组统计) 映射的结果还是目录(B)
# 映射(目录A)==目录A
# 3. tree(目录B) == tree(映射(目录A))
# 4. 总结为: 映射(tree(目录A)) == tree(映射(目录A)) : 很像运算符的穿透
# [使用例子]
# 1.目录树的文件mime-type统计
# echo 'file --mime-type --brief $FN' > /tmp/BuszCmd_MapFileNameToX && source /app/bash-simplify/dir_tree_group/tree_MapFN_Depth1Group_Cnt.sh && tree_MapFN_Depth1Group_Cnt /app/LineageOS_ota_xImg_ExtractTool/vendor/oneplus/sdm845-common/proprietary
# 2.目录树的文件扩展名统计
# echo ' echo "$FN" | egrep ".*\..+" 1>/dev/null 2>/dev/null && echo "${FN##*.}" || echo "EmptyExtend" ' > /tmp/BuszCmd_MapFileNameToX && source /app/bash-simplify/dir_tree_group/tree_MapFN_Depth1Group_Cnt.sh && tree_MapFN_Depth1Group_Cnt /app/LineageOS_ota_xImg_ExtractTool/vendor/oneplus/sdm845-common/proprietary
# 调试用 增加命令 sqlitebrowser /tmp/sqlite3db_file.db
set -e -u
function tree_MapFN_Depth1Group_Cnt(){
[[ $# -lt 1 ]] && return 61
rootD=$1
local flagD="/tmp"
local dbFP=$flagD/sqlite3db_file.db
local rootDId=$(echo "$rootD" | sed 's/\//--/g') # / --> --
local cmdF="$flagD/cmdF$rootDId"
local aggRootD="$flagD/aggRootD$rootDId"
local source_cmd="set -e -u; \n source /app/bash-simplify/dir_tree_group/tree_MapFN_Depth1Group_Cnt.sh"
cd $rootD
#生成命令文件
cat <(echo -e "$source_cmd" ) <(find . -type d | xargs -I@ echo "dire_list_file_mime $dbFP $rootDId $aggRootD $rootD @") | tee "$cmdF" 1>/dev/null
#删除先前的统计数据库
rm -f $dbFP
rm -fr $aggRootD
bash $cmdF
tree -I mime_ls.csv $aggRootD
echo "SELECT count(*) sqlite表中文件记录总数 FROM tab_file;" | sqlite3 --line "$dbFP"
}
function sqlite3_create_tab_import_fileNameLs() {
[[ $# -lt 4 ]] && return 63
local dbFP=$1
local mimeLsCsvFP=$2
local parentD=$3
local dirName=$4
which sqlite3 1>/dev/null || sudo apt install -y sqlite3 sqlitebrowser
#建立表结构
sqlite3 "$dbFP" < <(echo -e """
CREATE TABLE IF NOT EXISTS tab_file (outParentD varchar(512) , parentD varchar(512), dire varchar(128), fileName varchar(128), mimeType varchar(64));
.exit
""")
sqlite3 "$dbFP" <<EOF
.mode csv
.separator ;
.headers off
.import $mimeLsCsvFP tab_file
-- SELECT count(*) FROM tab_file;
.exit
EOF
}
function dire_list_file_mime() {
[[ $# -lt 5 ]] && return 62
local dbFP=$1
local rootDId=$2
local aggRootD=$3
local rootD=$4
local dire=$5
local agg_dire="$aggRootD/$dire"
mkdir -p $agg_dire
local parentD=$(dirname $dire)
local dirName=$(basename $dire)
local outParentD=$aggRootD/$parentD
local mimeLsCsvFP="$outParentD/mime_ls.csv"
local mimeAggOutFP="$outParentD/mime_agg.txt"
local directFileCnt=\
$( cd $rootD && cd $dire && find . -maxdepth 1 -type f |wc -l ;)
#............标记相同命令..............................
[[ $directFileCnt -eq 0 ]] && return 0 #若目录dire 无直接文件 则不处理
( cd $rootD && cd $dire && find . -maxdepth 1 -type f | while read -r _FN ; do ( FN="${_FN/.\//}" && mimeTyp=$(FN="$FN" bash /tmp/BuszCmd_MapFileNameToX) && echo "$outParentD;$parentD;$dire;$FN;$mimeTyp" ;) ; done | tee "$mimeLsCsvFP" 1>/dev/null;)
#举例1: /tmp/BuszCmd_MapFileNameToX == 'file --mime-type --brief $FN' #文件mimeType
#举例2: /tmp/BuszCmd_MapFileNameToX == ' echo "$FN" | egrep ".*\..+" 1>/dev/null 2>/dev/null && echo "${FN##*.}" || echo "EmptyExtend" ' #文件的扩展名
# 'while read' 替换xargs举例: seq 1 4 | while read -r k; do ( echo $k ;) ; done
sqlite3_create_tab_import_fileNameLs $dbFP $mimeLsCsvFP $parentD $dirName
local sql="select mimeType,count(*) from tab_file where parentD='$parentD' and dire='$dire' group by mimeType ;"
local mimeTyp_Cnt__Ls="$(sqlite3 "$dbFP" < <( echo "$sql" ) )"
mimeTyp_Cnt__Ls="$(echo "$mimeTyp_Cnt__Ls" | sed 's/\//--/g')" # / --> --
mimeTyp_Cnt__Ls="$(echo "$mimeTyp_Cnt__Ls" | sed 's/|/=/g')" # / --> =
echo "$mimeTyp_Cnt__Ls" | while read -r mimeTyp_Cnt ; do ( touch "$agg_dire/${mimeTyp_Cnt}" ;) ; done
}
原文地址:https://blog.csdn.net/hfcaoguilin/article/details/143652432
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!