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