#!/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 ]]
,但就我个人而言,我会首先提取扩展名并单独进行比较。
Nextshnum++
无效,您需要在 shell 算术((
复合命令内执行该命令,例如:((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
您可以将此要求概括为根据需要计算任意数量的扩展。为此,您需要一个支持关联数组的 shell,例如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
如果不需要就不要循环。不要在 shell 中循环,除非你操作在文件上。
对于大量文件名,这将比迄今为止提出的任何其他解决方案更快:
$ 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
打字也少了!