如何计算 tgz 压缩文件中特定文件类型的行数?

如何计算 tgz 压缩文件中特定文件类型的行数?

我看到下面的帖子可以帮助我获取每个 .tgz 文件中的总行数,但我只想计算这个压缩的 .tgz 文件夹中 .js 文件的行数,而不是所有内容。我该怎么做?

https://stackoverflow.com/questions/22064932/count-number-of-lines-of-gz-files-recursviely-on-directory

答案1

您想要提取与 stdout 匹配的所有文件*.js并用于wc -l计算行数:

tar -x -f file.tgz -O --wildcards '*.js' | wc -l

-O输出到 stdout,而不是将文件写入磁盘(如 tar 通常所做的那样)。

--wildcards允许您在提取的文件名中使用通配符(这可能仅限于 GNU,尽管在 Linux 上您将拥有该通配符)。

这将生成一个 tar 文件。如果有多个,则可以在循环中执行此操作,并将循环的输出通过管道传输到wc -l.

答案2

.js要获取压缩 tar 存档中每个文件的行数,请尝试:

tar -xf file.tgz --to-command='echo " $TAR_FILENAME $(wc -l)"' --wildcards '*.js'

作为演示,让我们从这个存档开始:

$ tar --list -f file.tgz
a.js
dir1/
dir1/b.js
other.txt

现在,让我们获取存档中每个 js 文件的行数:

$ tar -xf file.tgz --to-command='echo " $TAR_FILENAME $(wc -l)"' --wildcards '*.js' 
 a.js 10
 dir1/b.js 15

改进

如果我们想要更好的输出格式,我们可以printf使用echo

$ tar -xf file.tgz --to-command='printf "%-10s %s\n" "$TAR_FILENAME" "$(wc -l)"' --wildcards '*.js' 
a.js       10
dir1/b.js  15

怎么运行的

  • -x告诉 tar 提取文件。

  • -f file.tgz告诉 tar 从 中提取file.tgz

  • --to-command='echo "$TAR_FILENAME $(wc -l)"'告诉 tar 将此命令应用于每个提取的文件。 Tar 提供环境变量中每个文件的名称$TAR_FILENAME

  • --wildcards告诉 tar 使用 glob 选择要提取的文件。

  • '*.js'指定要提取的文件 glob。

相关内容