목록의 어떤 문자열이 디렉터리 재귀 검색에 절대 나타나지 않는지 확인하세요.

목록의 어떤 문자열이 디렉터리 재귀 검색에 절대 나타나지 않는지 확인하세요.

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

관련 정보