ディレクトリのファイル拡張子を確認するBashスクリプト

ディレクトリのファイル拡張子を確認するBashスクリプト
#!/bin/bash
#Number for .txt files
txtnum=0
#Number of .sh files
shnum=0

for file in "SOME_PATH";do
  #if file has extension .txt
   if [[ $file ==* ".txt"]]
   then 
    #increment the number of .txt files (txtnum)
    txtnum++
   elif [[ $file ==* ".sh"]]
   then 
    #increment the number of .sh files (shnum)
    shnum++
   fi
echo "Number of files with .txt extension:$txtnum"
echo "Number of files with .sh extension:$shnum"

上記のコードは機能しませんが、私が望むロジックをレンダリングします。

初心者の場合、bashコマンドが正しくない可能性があります。

答え1

編集されているため、明確に言うことはできませんが、ディレクトリ内のファイルに展開するには、SOME_PATH引用符のないglobを含める必要があります。*それは次のとおりです。

/path/to/*

Next は[[ $file ==* ".txt"]]無効です。特に==*有効な比較演算子ではありません。=~同様に正規表現の比較を行うことができますが、[[ $file =~ .*\.txt ]]個人的には拡張子を最初に抽出して個別に比較します。

以下はshnum++効果がありません。シェル算術複合コマンド内でコマンドを実行する必要があります((。例:((shnum++))

done最後に、ループの終了ステートメントがありませんfor


以下は、必要な操作を実行するいくつかの操作コードです。

#!/bin/bash

txtnum=0
shnum=0

for file in /path/to/files/*; do
    ext="${file##*.}"
    if [[ $ext == txt ]]; then
        ((txtnum++))
    elif [[ $ext == sh ]]; then
        ((shnum++))
    fi
done

printf 'Number of .txt files: %d\n' "$txtnum"
printf 'Number of .sh files: %d\n' "$shnum"

答え2

この要件を一般化して、必要なだけ多くの拡張を計算できます。これには連想配列をサポートするシェルが必要ですbash

#!/bin/bash
declare -A exts

for path in "${SOME_PATH-.}"/*
do
    # Only files
    [[ -f "$path" ]] || continue

    # Split off the file component, and then its name and extension
    file=${path##*/}
    name=${file%.*} extn=${file##*.}
    # printf "%s -> %s -> %s %s\n" "$path" "$file" "$name" "$extn"

    # Count this extension type
    (( exts[$extn]++ ))
done

# Here is what we want to know
echo "txt=${exts[txt]-0}, sh=${exts[sh]-0}"

答え3

努力する:

#!/bin/bash
txtnum=0
shnum=0

for file in /some/dir/*;do
  if [[ "${file}" =~ \.txt$ ]];then
    txtnum=$((txtnum+1))
  elif [[ "${file}" =~ \.sh$ ]];then
    shnum=$((shnum+1))
  fi
done

echo "Number of files with .txt extention:${txtnum}"
echo "Number of files with .sh extention:${shnum}"

答え4

必要でない限り繰り返さないでください。それ以外の場合は、シェルでループを繰り返さないでください。働くファイルに。

ファイル名が多い場合は、これまで提案されている他のソリューションよりも高速です。

$ ls /usr/lib | awk -F '[/.]+' \
  '{ ext[$NF]++ } END { for(e in ext){ printf ".%-7s\t%4d\n", e, ext[e]} }' | 
grep -Ew 'so|0' # or extensions of your choice
.0                28
.so               10

タイピングも減ります!

関連情報