您如何计算当前目录中所有文件中术语的每次出现?

Tel*_*Why 10 command-line files directory grep

您如何计算当前目录中所有文件中术语的每次出现?- 和子目录(?)

我已经读过要做到这一点,你会使用grep;确切的命令是什么?

另外,是否可以使用其他一些命令进行上述操作?

kos*_*kos 12

使用grep+ wc(这将满足该术语在同一行中多次出现的情况):

grep -rFo foo | wc -l
Run Code Online (Sandbox Code Playgroud)
  • -rin grep:在当前目录层次结构中递归搜索;
  • -Fin grep:匹配固定字符串而不是匹配模式;
  • -oin grep: 只打印匹配项;
  • -lin wc:打印行数;
grep -rFo foo | wc -l
Run Code Online (Sandbox Code Playgroud)

  • PCRE 不是“实验性的”,但它们也不总是编译为 grep(这就是我在需要时使用 pcregrep 的原因)。但是,在这种情况下,它们是不必要的,因为问题询问的是一个“术语”,它可能是一个固定字符串,而不是任何类型的模式。所以,`-F` 可能会更快。 (2认同)
  • @dannysauer 我使用 PCRE 是因为出于某种(错误的)原因,我认为它们 * 需要 * 来匹配同一行上的多个出现,但实际上它们不是。我只是没有尝试使用 `-F` 代替 `-P`。感谢您的好建议,使用`-F` 更新,这确实更适合这里。 (2认同)

Jos*_*Jos 8

grep -Rc [term] *会这样做。该-R标志表示您要递归搜索当前目录及其所有子目录。该*是一个文件选择的意义:所有文件。该-c标志grep仅输出出现次数。但是,如果单词在一行中出现多次,则只计算一次。

来自man grep

  -r, --recursive
          Read all files under each directory, recursively, following symbolic links only if they are on the command line.
          This is equivalent to the -d recurse option.

   -R, --dereference-recursive
          Read all files under each directory, recursively.  Follow all symbolic links, unlike -r.
Run Code Online (Sandbox Code Playgroud)

如果您的目录中没有符号链接,则没有区别。

  • `*` 只会扩展到非点文件,所以你会错过所有这些。仅使用“.”更有意义。因为无论如何你都会递归地处理参数 - 这将得到点文件。这里更大的问题是这可能是行数,而不是单词出现的次数。如果该术语在一行中出现多次,则“grep -c”只会计算一次 (2认同)