如何递归计算目录中的单词数?

时间:2016-02-22 17:09:39

标签: bash vim count grep word

我正在尝试计算项目中写的字数。文件夹中有几个层次,文本文件很多。

任何人都可以帮我找到一个快速的方法吗?

bash或vim会很好!

由于

5 个答案:

答案 0 :(得分:8)

使用find扫描目录树,wc将完成剩下的工作

$ find path -type f | xargs wc -w | tail -1

最后一行给出了总数。

答案 1 :(得分:3)

您可以找到并打印所有内容和管道到wc

find path -type f -exec cat {} \; -exec echo \; | wc -w

注意:如果文件没有以换行符结尾,则需要-exec echo \;,在这种情况下,一个文件的最后一个单词和下一个文件的第一个单词将不会分开。 / p>

或者您可以找到wc并使用awk汇总计数:

find . -type f -exec wc -w {} \; | awk '{ sum += $1 } END { print sum }'

答案 2 :(得分:2)

tldr;

if(getActivity()!=null) { viewPager.setAdapter(....youradapter); }

说明:

$ find . -type f -exec wc -w {} + | awk '/total/{print $1}' | paste -sd+ | bc 将对find . -type f -exec wc -w {} +(当前工作目录)包含的所有文件(递归地)运行wc -w.将尽可能少地执行find ,但必须多次执行以符合wc ---系统命令长度限制。当文件数量(和/或其组成长度)超过ARG_MAX时,ARG_MAX会多次调用find,提供多个wc -w行:

total

通过仅打印每个$ find . -type f -exec wc -w {} + | awk '/total/{print $0}' 8264577 total 654892 total 1109527 total 149522 total 174922 total 181897 total 1229726 total 2305504 total 1196390 total 5509702 total 9886665 total 行的第一个以空格分隔的字段来隔离这些部分总和:

total

$ find . -type f -exec wc -w {} + | awk '/total/{print $1}' 8264577 654892 1109527 149522 174922 181897 1229726 2305504 1196390 5509702 9886665 使用paste分隔符的部分和来给出中缀求和:

+

使用$ find . -type f -exec wc -w {} + | awk '/total/{print $1}' | paste -sd+ 8264577+654892+1109527+149522+174922+181897+1229726+2305504+1196390+5509702+9886665 评估中缀求和,它支持中缀表达式和任意精度:

bc

参考文献:

答案 3 :(得分:1)

如果我从SO上的所有问题中学到了一件事,那么带有空格的文件名会让你感到困惑。即使文件名中有空格,此脚本也能正常工作。

#!/usr/bin/env bash

shopt -s globstar
count=0
for f in **/*.txt
do
    words=$(wc -w "$f" | awk '{print $1}')
    count=$(($count + $words))
done
echo $count

答案 4 :(得分:0)

假设您不需要递归计算单词,并且希望将所有文件包括在当前目录中,则可以使用一种简单的方法,例如:

wc -l *


10  000292_0
500 000297_0
510 total

如果只想计算当前目录中特定扩展名的单词,可以尝试:

cat *.txt | wc -l