リスト内のどの文字列がディレクトリ再帰検索にも表示されないことを確認してください。

リスト内のどの文字列がディレクトリ再帰検索にも表示されないことを確認してください。

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}'

関連情報