使用 bash 计算目录中许多文件仅限 .h、.c 和 .py 文件的行数

问题描述

我被要求编写一个脚本(使用 bash)来计算在单个目录中重新组合的文件(但只有 C 文件(.h 和 .c)和 python 文件(.py))中的行数.我已经尝试过这段代码,但我的计算总是错误

let "sum = 0"
let "sum =  sum + $(wc -l $1/*.c | tail --lines=1 | tr -dc '0-9')"
let "sum =  sum + $(wc -l $1/*.h | tail --lines=1 | tr -dc '0-9')"
let "sum =  sum + $(wc -l $1/*.py | tail --lines=1 | tr -dc '0-9')"
echo $sum >> manifest.txt

我必须在“manifest.txt”文件中写入总数,我的脚本的参数是包含文件的目录的路径。

如果有人有另一种技术来计算这个,我将不胜感激。 谢谢!

解决方法

版本 1:循序渐进

#!/bin/bash
echo "Counting the total number of lines for all .c .h .py files in $1"
sum=0
num_py=$(wc -l $1/*.py | tail -1 | tr -dc '0-9')
num_c=$(wc -l $1/*.c | tail -1 | tr -dc '0-9')
num_h=$(wc -l $1/*.h | tail -1 | tr -dc '0-9')
sum=$(($num_py + $num_c + $num_h))
echo $sum >> manifest.txt

版本 2:简洁

#!/bin/bash
echo "Counting the total number of lines for all .c .h .py files in $1"
echo "$(( $(wc -l $1/*.py | tail -1 | tr -dc '0-9') + $(wc -l $1/*.c | tail -1 | tr -dc '0-9') + $(wc -l $1/*.h | tail -1 | tr -dc '0-9') ))" >> manifest.txt

版本 3:循环你想要的文件

#!/bin/bash
echo "Counting the total number of lines for all .c .h .py files in $1"
sum=0
for sfile in $1/*.{c,h,py}; do 
sum=$(($sum+$(wc -l $sfile|tail -1|tr -dc '0-9')))
done
echo $sum >> manifest.txt

这就是算术运算的工作原理:var = $((EXPR)) 例如:$sum= $(($sum + $result )) 在 EXPR 中错过 $ 符号是很常见的!尽量不要忘记它们:)

,

您也可以使用循环来聚合计数:

extensions=("*.h" "*.c" "*.py")

sum=0
for ext in ${extensions[@]} ; do
   count=$(wc -l ${1}/${ext} | awk '{ print $1 }')
   sum=$((sum+count))
done    

echo "${sum}"
,

这是我使用的脚本(稍作修改):

files=( $(find . -mindepth 1 -maxdepth 1 -type f -iname "*.h" -iname "*.c" -iname "*.py") )
declare -i total=0

for file in "${files[@]}"; do
    lines="$(wc -l < <(cat "$file"))"
    echo -e "${lines}\t${file}"
    total+="$lines"
done

echo -e "\n$total\ttotal"

,

这是我的版本。

#!/usr/bin/env bash

shopt -s extglob nullglob

files=( "$1"/*.@(c|h|py) )

shopt -u extglob nullglob

while IFS= read -rd '' file_name; do
  count=$(wc -l < "$file_name")
  ((sum+=count))
done< <(printf '%s\0' "${files[@]}")

echo "$sum" > manifest.txt

需要一些错误检查,比如参数是否是一个目录,或者它是否存在,等等。