我使用 find 搜索所有子目录和当前目录以查找所有 .py 文件,然后运行 wc -l 查找行数。但是,当我将 find 与 wc 一起使用时,Total 字段被忽略,这与单独运行 wc 时不同。有人知道为什么会发生这种情况吗?
find . -name \*.py -exec wc -l {} \;
187 ./check.py
43 ./file.py
33 ./mitch.py
...
1014 ./serve.py
41 ./test_scripts/line_graph.py
39 ./welcome.py
但没有总数,但是当我wc -l *.py
在目录中运行时我得到了总数:
wc -l *.py
187 check.py
43 file.py
94 log_com.py
154 log_results.py
33 mitch.py
1014 serve.py
39 welcome.py
1564 total
答案1
wc
仅输出全部的当使用多个文件作为参数调用它时的值。
来自GNU 手册:
如果给出了多个文件,
wc
则打印包含累积计数的最后一行,并带有文件名total
。
就你的情况而言,你不能得到全部的输出,因为您wc
对找到的每个文件调用一次,所以每个后续wc
调用都不知道前一个调用。
如果您仍然想要总数,您可以使用globstar
Bash 中的选项递归到目录并列出.py
文件:
shopt -s globstar
wc -l **/*.py
或者,正如 grawity 所建议的那样,使用 GNUfind
的-exec command {} +
选项,替换find
中找到的所有路径{}
,而不是单独调用每个路径(尽管它可以替换的文件数量是有限的,就像 glob 方法一样)。
答案2
没有total
字段,因为只有一个文件。
随着行动,运行-exec command {} ;
find
命令 每个文件一次,每次只添加一个参数。因此每次wc
调用都无法计算总数。
如果您有 GNU 则必须使用;否则您需要将文件列表通过管道传输到。-exec command {} +
find
xargs command
(在这个答案中,我不会理会通常的-print0
建议,因为如果你没有 GNU find,你也不会有-print0
甚至 GNU xargs。但是,如果你的 xargs 版本做支持-d '\n'
,使用它,因为 xargs 解析输入的默认方式不是很安全。)
请注意,这可能仍会导致多次wc
调用,因为大多数操作系统(也许 Hurd 除外)对最大命令行长度和/或单个命令的最大参数数量都有限制,而大量文件可能会超过这个限制。@slhck 的建议使用**/*.py
也会达到同样的限制(早期的 Unix 具有非常低的限制,这就是xargs
首先创建的原因)。
另一种方法是使用awk
以下方法进行最终计算:
find ... | awk '$2 != "total" {sum += $1; print}
END {printf "%7d total\n", sum}'