递归计算目录中 .gz 文件的行数是多少?

3
我有成百上千个目录,每个目录都包含一个 .gz 文件,我想计算该 .gz 文件的行数。
我尝试使用以下一行命令来实现这个目标,但它不起作用,显示出错信息:gzip: stdin: unexpected end of file。
find . type -f -name '*.data.gz' | gunzip -c  | wc -l 

例如,如果有两个目录,每个目录中都有一个 .gz 文件,并且假设每个文件都有 100 行,则我希望输出总共 200 行。

在“gunzip”之前添加“xargs”。 - Beano
4个回答

11

你差点就成功了...

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

2
或者,只需使用“zcat *.gz | wc -l”命令 - arekolek
1
实际上,OP明确要求递归解决方案,所以我的解决方案不可行。在zsh中或在启用了~/.bashrc中的shopt -s globstarbash中,zcat **/*.gz | wc -l是可以的。 - arekolek
@arekolek 这个命令是针对账户子文件夹的 .gz 文件,还是当前目录? - Memin
1
@Memin *.gz 表示当前目录,而 **/*.gz 表示当前目录及其子文件夹。 - arekolek

4
gzip -dc *.gz | wc -l
这条命令的作用是将所有以.gz结尾的文件解压并计算行数。

-d 表示解压缩

-c 表示输出到标准输出(而不是磁盘)

或者

gzip -dcr * | wc -l

-d 表示解压缩

-c 表示输出到标准输出(而不是磁盘)

-r 表示递归查找目录中的文件


zcat(某些系统上为gzcat)相当于gzip -dcgunzip -c - arekolek
此外,第二个选项将(尝试)输出所有文件,而不仅仅是.gz扩展名的文件,并可能打印有关“不在gzip格式中”的文件的消息。 - arekolek

3

我的目录:

.
├── a.gz
├── b.gz
└── t
    └── f.gz

查找每个gz文件并输出每个文件的行数和内容:

find . -type f -name '*.gz' -exec bash -c 'echo $1;gunzip -c $1 | wc -l' dummy {} \;

输出:

./a.gz
5
./b.gz
6
./t/f.gz
3

为了获得总数:

echo $((`find . -type f -name '*.gz' -exec bash -c 'gunzip -c $1 | wc -l' dummy {} \;  | paste -sd+`))

输出:

14

为什么我们需要在这里加一个虚拟变量?我尝试过不加虚拟变量,但是它不起作用。但我不知道为什么需要一个虚拟变量。 - q0987
这对于获取单个计数非常有帮助。该命令可以通过在$1周围添加双引号来改进 - 适用于文件名中包含空格的情况。 - svenski

0

您可以使用此代码片段。

#!/bin/bash

gzfiles=`find . -name '*.data.gz'`

total_line_count=0
if [ $? -eq 0 ]; then
        echo "Found at:"
        for file in $gzfiles
                do
                        echo " - $file"
                        fl_line_count=`gunzip $file -c | wc -l`
                        total_line_count=`expr $total_line_count + $fl_line_count`
                done
        else
                echo "No GZIP file found :("
fi

echo "Line count: $total_line_count"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接