使用 for 循环计算当前目录中每个文件的行数?

使用 for 循环计算当前目录中每个文件的行数?
  • 如果提供参数作为输入,脚本应仅检查该输入文件的行数,否则脚本应显示该目录中每个文件的行数。
  • 应忽略脚本文件,即不应显示脚本文件的计数。

我试过:

#!/bin/bash
if [ $# -eq 0 ]
then
        for l in *.txt
        do
                echo $(wc -l $l)
        done
else
        for l in $*
        do
                echo $(wc -l $l)
        done
fi

但我不允许明确提及文件类型,即 *.txt - 它必须检查除脚本文件之外的所有文件。

答案1

我想你差不多明白了。您可以basename "$0"使用从脚本中查找脚本的名称,并打印除以下内容之外的所有内容的行数

#!/bin/bash
if [ $# -eq 0 ]
then
    for k in *
    do
        if [[ ! -d "$k" && "$k" != `basename "$0"` ]]
        then
            wc -l "$k"
        fi
    done
else
    for k in $*
    do
         wc -l "$k"
    done
fi

我冒昧地

  • 使用k代替l(不推荐用于变量名,我很确定,尽管我找不到链接(它可能与1,混淆I))
  • 使用 4 个空格而不是 8 个空格进行缩进。最后这当然是你的决定,但我想说 4 个空格比 8 个更具可读性。
  • 引用你的变量。强烈建议避免用空格分割变量名称。
  • echo像@Serg 指出的那样,删除不必要的内容。

编辑我添加了双括号和目录测试以忽略它们以及if条件。

答案2

#!/bin/bash

if [[ "$#" != 0 ]]; then
  # only process the names given to us
  wc -l "$@"
  exit
fi

# process all regular files in this directory, avoiding this script
for f in ./*; do
    if [[ "$f" != "$0" ]] && [[ -f "$f" ]]; then
        wc -l "$f"
    fi
done

答案3

除了脚本之外,您还可以将三 (3) 个命令组合在一行中并打印您想要的结果。
例如。

find . -maxdepth 1 -type f -name "*.txt" -exec cat {} + | wc -l

如果您不想只在当前目录中搜索,但又想递归地计算行数,则可以删除“-maxdepth 1”开关或根据需要更改数字。

相关内容