Попробуйте:
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