我想查看使用该命令找到的每个文件中存在多少行find
。
我知道我可以用来wc -l
查找单个文件的行号。但是,当从以下输出进行管道传输时,这不起作用find
:
find -type f -name package.json | wc -l
这将返回找到的文件的计数。我想返回每个找到的文件的行数。
答案1
wc
w
获取其字节/字符/命令/行c
计数的文件列表论点。
当不带参数调用时,它会在其标准输入中报告这些字节/字符/单词/行。因此,如果您通过管道传输find
到wc -l
,您将在 的输出中获得换行符的数量find
,因此这将是找到的文件的数量加上其路径中的换行符的数量。
GNU 实现wc
还可以使用该选项从文件中获取以 NUL 分隔的文件列表--files0-from
,它将其视为-
意义 stdin (而不是名为 的文件-
),因此您可以执行以下操作:
find . -name package.json -type f -print0 |
wc -l --files0-from=-
使用任何标准find
或wc
实现,您都可以find
传递文件路径列表作为参数与wc
:
find . -name package.json -type f -exec wc -l {} +
但是,如果有大量匹配文件,则最终可能会运行wc
多次,从而导致一行出现多次total
。
wc
total
当给定至少 2 个文件需要处理时,会打印该行,因此要跳过该total
行,您可以执行以下操作:
find . -name package.json -type f -exec wc -l {} ';'
尽管这会非常低效,因为分叉进程并为每个文件执行命令非常昂贵。
如果这是您真正感兴趣的总数,那么您会这样做:
find . -name package.json -type f -exec cat {} + | wc -l
我们将cat
这些文件内容的连接提供给wc
.
使用zsh
和 any wc
,你可以这样做:
wc -l -- **/package.json(D.)
(D
对于otglob 来说,也可以像dosD
一样获取隐藏的,并且只包含find
.
常规的文件相当于-type f
)。
这样做的好处是可以为您提供排序列表并避免使用前缀./
。
这次,如果没有或太多匹配文件,您将收到错误。
使用 GNU du
,您可以通过将 NUL 分隔的 glob 扩展传递给wc -l --files0-from=-
with 来避免这些问题:
print -rNC1 -- **/package.json(ND.) | wc -l --files0-from=-
另请注意,在 json 格式中,换行符(很wc -l
重要)并不重要,因此我不确定这是否是您获得的有用指标。
例如,您可以返回这些文件中某些数组中的元素数量,而不是:
find . -name package.json -type f -exec \
jq -r '[.devDependencies|length,input_filename]|@csv' {} +
(假设文件路径是 UTF-8 编码文本,此处给出 CSV 格式的结果)。
答案2
您可以使用xargs
将标准输入通过管道传输到需要的参数向量中:
find -type f -name package.json | xargs wc -l
或者干脆让 shell 命令替换来填充它
wc -l $(find -type f -name package.json)