각 하위 디렉터리에서 3개의 고유한 파일을 검색하고 3개의 파일이 모두 존재할 때 하위 디렉터리를 나열하려면 어떻게 해야 합니까? 그런 다음 처음 7자를 기준으로 고유한 하위 디렉터리를 찾습니다.

각 하위 디렉터리에서 3개의 고유한 파일을 검색하고 3개의 파일이 모두 존재할 때 하위 디렉터리를 나열하려면 어떻게 해야 합니까? 그런 다음 처음 7자를 기준으로 고유한 하위 디렉터리를 찾습니다.

아래 예와 같은 내용의 디렉토리가 있습니다. subdir1, subdir2 & subdir3파일을 검색하고 싶습니다 testA/*a.txt, testB/*b.txt & testC/*c.txt. 나는 3개의 하위 디렉터리만 모두 포함하는 목록을 원합니다.

subdir1이 예에는 & 만 있습니다 subdir2.

subdir1/
subdir1/testA/
subdir1/testA/subdir1-a.txt
subdir1/testB/
subdir1/testB/subdir1-b.txt
subdir1/testC/
subdir1/testC/subdir1-c.txt
subdir2/
subdir2/testA
subdir2/testA/subdir2-a.txt
subdir2/testB
subdir2/testB/subdir2-b.txt
subdir2/testC/
subdir2/testC/subdir2-c.txt
subdir3/
subdir3/testA
subdir3/testA/subdir3-a.txt
subdir3/testB
subdir3/testB/subdir3-b.txt
subdir3/testC/
subdir3/testZ
subdir3/testZ/subdir3-z.txt

그런 다음 출력을 알파벳 순서로 가져오고 싶습니다. 예를 들면 다음과 같습니다.

subdir1
subdir2

...그런 다음 고유한 항목만 가져옵니다.

find( 현재 사용하고 있고 디렉터리가 순서대로 나열되어 있지 않기 때문에 이러한 필요성이 존재합니다 . 하위 디렉터리에도 이름이 더 길고 복잡합니다.)

어떻게 해야 하나요?

다음과 같이 files 와 같은 한 가지 유형의 파일을 나열했습니다 *-a.txt.

find . -wholename "**/testA/*a.txt

답변이 이미 어딘가에 존재한다면 죄송합니다. 찾아보았지만 찾을 수 없었습니다. 어떤 조언이라도 대단히 감사하겠습니다.

답변1

다음과 같은 것은 어떻습니까?

$ shopt -s nullglob
$ for dir in */; do 
    f1=( "$dir"/testA/*a.txt ) 
    f2=( "$dir"/testB/*b.txt )
    f3=( "$dir"/testC/*c.txt )
    if [[ "${#f1[@]}" -gt 0  && "${#f2[@]}" -gt 0 && "${#f3[@]}" -gt 0 ]]; then 
        printf '%s\n' "$dir" 
    fi
done
subdir1/
subdir2/

먼저, bash의 옵션을 켜서 nullglobglob 확장과 일치하는 파일이 빈 문자열이 아닌지 확인하세요. 다음으로, 현재 디렉터리의 모든 하위 디렉터리를 반복하고 각 하위 디렉터리에 대해 해당 glob 확장 결과를 배열에 저장합니다. 그런 다음 세 배열 모두에 하나 이상의 요소가 있으면 하위 디렉터리의 이름을 인쇄합니다.

동일한 기본 작업을 수행할 수도 있습니다 find.

$ for dir in */; do 
    if [[ $(find "$dir" -wholename "*/testA/*a.txt" | wc -l) -gt 0 &&
          $(find "$dir" -wholename "*/testB/*b.txt" | wc -l) -gt 0 &&
          $(find "$dir" -wholename "*/testC/*c.txt" | wc -l) -gt 0 ]]; then 
        printf '%s\n' "$dir" 
    fi
done
subdir1/
subdir2/

관련 정보