使用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";文件,而我的脚本的参数是包含这些文件的目录的路径。

如果有人有另一种计算方法,我将不胜感激。非常感谢。

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

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}"

版本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中错过CCD_ 3符号是非常常见的!尽量不要忘记它们:)

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

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$totalttotal"

这是我的版本。

#!/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' "${files[@]}")
echo "$sum" > manifest.txt

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

最新更新