linux shell統計異なるファイル拡張子の個数

2619 ワード

構想:拡張子を関連配列の下標としてlsの出力を遍歴し,対応する拡張子に+1を与え,最後に結果を出力する.
まず、関連配列を宣言します.
declare -A exnames;
lsで得られた結果はすべてファイルではなく、grepを使用してファイルタイプの行を抽出し、awkを使用してファイル名を得る必要があります.
names=$( ls -al ${dir}|grep "^-"|awk '{for(i=9;i<=NF;i++){print $i}}');
拡張子(org.eclipse.java.xmlなどの複数の点を含むファイル名がある)を正しく取り出すには、左から右にマッチングし、最後の点までマッチングする必要があります.shellで提供されている##オペレータを使用する必要があります.このオペレータは、左から右への貪欲なマッチングであり、操作の結果、マッチングした文字列を削除します.
file_name=”com.java.xml”
echo ${file_name##*.}
xmlが出力されます
異なる大文字と小文字は統計に干渉するので、拡張子をすべて小文字に統一するには、次の文を使用します.
line=`tr '[A-Z]' '[a-z]'<<<"$line"`
また、.最初のファイル名は非表示のファイルを表し、計算には含まれません.このため、ファイル名を巡回する際には、まず(1)そのファイル名に.番号(2)が含まれているか否かを判断する.番号は.番号で始まることができず、コードは以下の通りである.
  tp=`grep "\."<<<"${line}"`;
  rtnval1=$?;
  tp=`grep "^\."<<<"${line}"`;
  rtnval2=$?;
  if [ $rtnval1 -eq 0 ] && [ $rtnval2 -ne 0 ]   #determine whether there is . in current line
  then 
      ex=${line##*.};
      exnames[${ex}]=`expr 1 + ${exnames[${ex}]}`;
  fi
次に拡張子を抽出して数量の計算を行います.もちろん,関連配列を使用する前に初期化を行った.
最後に,配列中のコンテンツを簡単なループで印刷することを実現した.
最後の完全なスクリプトは次のとおりです.
dir=$1;
declare -A exnames; 
#names=$(ls -1 ${dir});
names=$( ls -al ${dir}|grep "^-"|awk '{for(i=9;i<=NF;i++){print $i}}');
for line in ${names}
do
  line=`tr '[A-Z]' '[a-z]'<<<"$line"`;
  tp=`grep "\." <<<"${line}"`;
  rtnval1=$?;
  tp=`grep "^\." <<<"${line}"`;
  rtnval2=$?;
  if [ $rtnval1 -eq 0 ] && [ $rtnval2 -ne 0 ]   #determine whether there is . in current line
  then
      ex=${line##*.};   #find extension
      exnames[${ex}]=0;
  fi
done


### count the extensions
for line in ${names}
do
  line=`tr '[A-Z]' '[a-z]'<<<"$line"`;
  tp=`grep "\." <<<"${line}"`;
  rtnval1=$?;
  tp=`grep "^\." <<<"${line}"`;
  rtnval2=$?;
  if [ $rtnval1 -eq 0 ] && [ $rtnval2 -ne 0 ]   #determine whether there is . in current line
  then 
      ex=${line##*.};
      exnames[${ex}]=`expr 1 + ${exnames[${ex}]}`;
  fi
done


function printArrWithDot()
{
  if test ${#exnames[@]} -eq 0
  then
    echo No files with extensions;
  else
    for index in ${!exnames[*]}
    do
      echo -e "EX: .${index}    \tCount: ${exnames[${index}]}";
    done
  fi
}
echo  ;
echo ===== Numbers of different extensions:=====
printArrWithDot;