当前位置: 首页 > article >正文

目录树文件名映射深度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
}



http://www.kler.cn/a/392750.html

相关文章:

  • SpringBoot使用Validation校验参数
  • iClient3D for Cesium 加载shp数据并拉伸为白模
  • 目标检测——基于yolov8和pyqt的螺栓松动检测系统
  • 操作系统导论读书笔记
  • Java 中压缩图片并应用 EXIF 旋转信息
  • SWIFT基本使用
  • Mysql用户权限与账号管理
  • Conda环境、Ubuntu环境移植
  • Scala 的List
  • 【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-成绩排序ABCDE
  • 3DTiles之使用customShader调整风格
  • 图像处理实验一(Matlab Exercises and Image Fundamentals)
  • Unity使用PS合并贴图
  • 「IDE」PyCharm 之 安装与卸载
  • Python 数据库操作教程
  • python购物计算 2024年6月青少年电子学会等级考试 中小学生python编程等级考试一级真题答案解析
  • 51c自动驾驶~合集21
  • python,dataclasses模块介绍及示例
  • 基于MATLAB的图像处理字母识别
  • MySQL初学之旅(2)增删改查—上
  • java 读取log日志文件关键信息
  • BeanUtils.copyProperties,拷贝后,修改target对象的字段,如果保证source对象字段不会变化
  • 2024年9月 GESP CCF C++六级编程能力等级考试认证真题
  • Jailbreaking ChatGPT via Prompt Engineering: An Empirical Study
  • 手术机器人:精准医疗的新选择
  • blind-watermark - 水印绑定