如何以人类可读的格式列出目录中每个文件的行数。

如何以人类可读的格式列出目录中每个文件的行数。

我有一个包含大型 csv 文件的目录和子目录列表。这些文件大约有5亿行,每行都是一条记录。我想知道

  1. 每个文件中有多少行。
  2. 目录中有多少行。
  3. 总共有多少行

最重要的是,我需要“人类可读格式”,例如。 12,345,678 而不是 12345678

如果能够学习如何通过 3 种方式做到这一点,那就太好了。普通的 bash 工具、awk 等,以及 perl(或 python)。

答案1

每个文件中有多少行。

我相信,最初使用wc, 是为了字数统计,但它可以计算行、单词、字符、字节和最长的行长度。该-l选项告诉它计算行数。

wc -l <filename>

这将输出中的行数:

$ wc -l /dir/file.txt
32724 /dir/file.txt

您还可以通过管道将数据传输到wc

$ cat /dir/file.txt | wc -l
32724
$ curl google.com --silent | wc -l
63

目录中有多少行。

尝试:

find . -name '*.pl' | xargs wc -l

另一句:

( find ./ -name '*.pl' -print0 | xargs -0 cat ) | wc -l

顺便说一句,wc命令计算新行代码,而不是行数。当文件中的最后一行不以新行代码结束时,这不会被计算在内。

您可以使用 grep -c ^ ,完整示例:

#this example prints line count for all found files
total=0
find /path -type f -name "*.php" | while read FILE; do
     #you see use grep instead wc ! for properly counting
     count=$(grep -c ^ < "$FILE")
     echo "$FILE has $count lines"
     let total=total+count #in bash, you can convert this for another shell
done
echo TOTAL LINES COUNTED:  $total

总共有多少行

不确定我是否正确理解了您的请求。例如,这将以以下格式输出结果,显示每个文件的行数:

# wc -l `find /path/to/directory/ -type f`
 103 /dir/a.php
 378 /dir/b/c.xml
 132 /dir/d/e.xml
 613 total

或者,仅输出不带文件的换行符总数,按文件计数到以下命令可能会很有用:

# find /path/to/directory/ -type f -exec wc -l {} \; | awk '{total += $1} END{print total}'
 613

最重要的是,我需要“人类可读格式”,例如。 12,345,678 而不是 12345678

巴什有一个打印函数内置函数:

printf "%0.2f\n" $T

与往常一样,有许多不同的方法可用于实现此处提到的相同结果。

答案2

在许多情况下,组合wc命令和通配符*可能就足够了。
如果您的所有文件都在一个目录中,您可以调用:

wc -l src/*

您还可以列出多个文件和目录:

wc -l file.txt readme src/* include/*

此命令将显示文件列表及其行数。
最后一行将是所有文件中行的总和。


要递归计算目录中的所有文件:

首先,通过添加到您的 .bash_profile 来启用 globstar shopt -s globstar。支持 globstar 需要 Bash ≥ 4.x,brew install bash如果需要可以安装。您可以使用 检查您的版本bash --version

然后运行:

wc -l **/*

请注意,如果未启用 globstar,此输出将不正确。

答案3

此命令将给出每个目录中的行代码列表:

find . -name '*.*' -type f | xargs wc -l

答案4

游戏有点晚了,但由于目录的大小,我在上面遇到了一堆参数错误。这对我有用:

for i in $(find . -type f); do wc -l $i; done >> /home/counts.txt

相关内容