Я понимаю, что уже есть общепринятый ответ на этот вопрос, но я чувствую, что должен указать, что на самом деле есть способ сделать это.
Опция --remote-name-all
указывает curl вести себя так, как если бы вы использовали -O
или --remote-name
для каждого файла.
https://curl.haxx.se/docs/manpage.html#--remote-name-all
Эта опция доступна с версии 7.19.0
Попробуйте:
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
Вы можете сделать это с помощью 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}'