用于检查目录中文件扩展名的 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 ]],但就我个人而言,我会首先提取扩展名并单独进行比较。

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

打字也少了!

相关内容