특정 문자열을 포함하지 않는 특정 파일의 하위 디렉터리 식별

특정 문자열을 포함하지 않는 특정 파일의 하위 디렉터리 식별

dir1나는 이라는 이름의 약 800개의 하위 디렉터리를 포함하는 이라는 디렉터리를 가지고 있습니다 disp-001, disp-002, ... disp-800. 하위 디렉터리를 찾아야 합니다.

  • 파일이 포함되어 있지 stdout않거나
  • 파일이 있는 경우 해당 파일에는 특정 문자열이 포함되어 있지 않습니다 str1.

파일이 포함되지 않은 하위 디렉터리를 식별하는 대답은 다음과 같습니다.또 다른 문제

$ find . -type d \! -exec test -e '{}/stdout' \; -print

그런데 위 명령에 grep을 포함시키려고 하면 작동하지 않습니다.

 $ find . -type d \! -exec test -e 'grep str1 {}/stdout' \; -print

관심 있는 디렉토리를 반환하기 위해 문자열 검색을 포함하려면 어떻게 해야 합니까?

답변1

거기에 어떤 솔루션이라도 적용할 수 있습니다.

  • 사용( -exec 또는 -exec )그리고지속 가능한 개발 관리또는패트릭해결책( exec첫 번째가 반환되는 경우에만 두 번째를 실행하고 false, -print둘 중 하나가 반환되는 경우에만 실행 true):

    find . -type d \( ! -exec test -f '{}/stdout' \; -o ! -exec grep -q str1 '{}/stdout' \; \) -print
    

    또는 제안된 대로 더 짧게코스타스:

    find . -type d \! -exec grep -q 'str1' {}/stdout 2>/dev/null \; -print
    
  • 이용 약관테든해결책:

    for d in **/
    do
      if [[ ! -f "$d"stdout ]] then
        printf '%s\n' "$d"
      else
        grep -q str1 "$d"stdout || printf '%s\n' "$d"
      fi
    done
    
  • 또는 다음을 사용하여 zsh:

    print -rl **/*(/e_'[[ ! -f $REPLY/stdout ]] || ! grep -q str1 $REPLY/stdout'_)
    

답변2

목록을 얻으려면 다음을 사용하십시오 grep.

grep -L str1 dir-*/stdout

어디:

  • -L일치하지 않는 파일만 제공됩니다.
  • str1검색하려는 문자열입니다.
  • 파일의 깊이가 동일한 경우 간단한 와일드카드를 사용할 수 있습니다.
    • -r그렇지 않은 경우 플래그를 사용하여 grep디렉토리에서 검색을 반복하십시오 .

작업을 계속하고 목록을 처리하려면 null 바이트로 구분된( greps -Z) 목록을 while 루프에 전달할 수 있습니다.

grep -LZ str1 dir-*/stdout | while IFS= read -r -d '' f; do
  echo "${f%%/*}" # gives the directory name
done

관련 정보