我有一个字符串列表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}'