自学内容网 自学内容网

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