检查列表中的哪些字符串永远不会出现在目录的递归搜索中

检查列表中的哪些字符串永远不会出现在目录的递归搜索中

我有一个字符串列表stringList,我想在其中递归搜索目录并找到其中的所有stringList字符串不是出现在任何搜索结果中。现在,我有

cat stringList | grep -qrf /dev/stdin .

但我不知道之后该去哪里。

例如我有字符串

酒吧

巴兹

目录中的文件中仅存在 foo 。脚本应该返回

酒吧

巴兹

答案1

尝试:

string="foo
bar
baz"
echo "$string" | grep -v "$(find . -type f -exec cat {} + | grep -o "$string")"

选择这种方法是因为它只读取输入文件一次。

怎么运行的

  • find . -type f -exec cat {} +

    这会对文件进行递归搜索并将其内容打印到标准输出。

  • grep -o "$string"

    这将选择与 的行匹配的任何文本$string

  • echo "$string" | grep -v "$(find . -type f -exec cat {} + | grep -o "$string")"

    grep -v返回在递归搜索的文件之一中找不到的字符串中的任何行。

例子

考虑一个目录,其下的文件包含:

$ find . -type f -exec cat {} +
bar none
Here baz scaggs
behind bars
bazooka

如果我们添加 grep,我们只会得到匹配的单词:

$ find . -type f -exec cat {} + | grep -o "$string"
bar
baz
bar
baz

将所有内容放在一起,我们确定这foo是唯一不在文件中的单词:

$ echo "$string" | grep -v "$(find . -type f -exec cat {} + | grep -o "$string")"
foo

答案2

你可以这样做gawk

find . -type f -print0 | gawk -v listfile=/path/to/stringList '
  BEGIN{
    while ((getline string < listfile) > 0) list[string]
    RS="\0"
    while ((getline file < "/dev/stdin") > 0) ARGV[ARGC++] = file
    RS="\n"
  }
  {for (s in list) if (index($0, s)) delete list[s]}
  END {for (s in list) print s}'

相关内容