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 바이트로 구분된( grep
s -Z
) 목록을 while 루프에 전달할 수 있습니다.
grep -LZ str1 dir-*/stdout | while IFS= read -r -d '' f; do
echo "${f%%/*}" # gives the directory name
done