#!/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
タイピングも減ります!