Bash 计算并打印出以特定字母开头的文件的脚本

Bash script that counts and prints out the files that start with a specific letter

如何打印出当前目录下所有以字母“k”开头的文件?还要统计这些文件。

我尝试了一些方法,但我只得到错误或错误的输出。作为 bash.

中的新手,真的坚持这个

首先:从不解析 ls 命令的输出,而是使用 find
由于 find 基本上遍历所有子目录,您可能需要限制它,使用 -maxdepth 开关,使用值 1.
为了计算结果的数量,您只需计算输出中的行数(如果您的输出显示为每行一个输出,find 命令就是这种情况)。使用 wc -l 命令计算行数。

所以,这归结为以下命令:

find ./ -maxdepth 1 -type f -name "k*" | wc -l

玩得开心!

这是一个纯粹的 Bash 解决方案。

files=(k*)
printf "%s\n" "${files[@]}"
echo "${#files[@]} files total"

shell 将通配符 k* 扩展到数组中,从而用匹配文件列表填充它。然后我们打印出数组的元素及其计数。

数组的使用避免了文件名中元字符的各种问题(参见例如https://mywiki.wooledge.org/BashFAQ/020),尽管语法有点难看。

正如 pjh 所说,这将在计数中包括任何匹配的目录,如果没有匹配项,则会以奇怪的方式失败(除非您将 nullglob 设置为 true)。如果避免目录很重要,您基本上必须将目录放入一个单独的数组中并排除它们。

重复多米尼克也说过的话,avoid parsing ls output

这个和其他各种候选解决方案的演示: https://ideone.com/XxwTxB

试试这个 Shellcheck-clean pure POSIX shell 代码:

count=0
for file in k*; do
    if [ -f "$file" ]; then
        printf '%s\n' "$file"
        count=$((count+1))
    fi
done
printf 'count=%d\n' "$count"
  • 当 运行 位于不包含任何以 'k'.
  • 开头的目录时,它可以正常工作(仅打印 count=0
  • 它不计算目录或其他 non-files(例如 fifos)。
  • 它计算文件的符号链接,但不包括损坏的符号链接或指向 non-files 的符号链接。
  • 它适用于 'bash' 和 'dash',并且应该适用于任何 POSIX-compliant shell。

这也应该有效:

VAR="k"
COUNT=$(ls -p ${VAR}* | grep -v ":" | wc -w)
echo -e "Total number of files: ${COUNT}\n" 1>&2
echo -e "Files,that begin with ${VAR} are:\n$(ls -p ${VAR}* | grep -v ":" )" 1>&2