Проверить, какие строки из списка никогда не появляются при рекурсивном поиске директории

Я понимаю, что уже есть общепринятый ответ на этот вопрос, но я чувствую, что должен указать, что на самом деле есть способ сделать это.

Опция --remote-name-all указывает curl вести себя так, как если бы вы использовали -O или --remote-name для каждого файла.

https://curl.haxx.se/docs/manpage.html#--remote-name-all

Эта опция доступна с версии 7.19.0

https://curl.haxx.se/changes.html#7_19_0

2
29.03.2019, 21:16
2 ответа

Попробуйте:

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
27.01.2020, 22:02

Вы можете сделать это с помощью 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}'
1
27.01.2020, 22:02

Теги

Похожие вопросы