![각 하위 디렉터리에서 3개의 고유한 파일을 검색하고 3개의 파일이 모두 존재할 때 하위 디렉터리를 나열하려면 어떻게 해야 합니까? 그런 다음 처음 7자를 기준으로 고유한 하위 디렉터리를 찾습니다.](https://linux55.com/image/214257/%EA%B0%81%20%ED%95%98%EC%9C%84%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EC%97%90%EC%84%9C%203%EA%B0%9C%EC%9D%98%20%EA%B3%A0%EC%9C%A0%ED%95%9C%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EA%B2%80%EC%83%89%ED%95%98%EA%B3%A0%203%EA%B0%9C%EC%9D%98%20%ED%8C%8C%EC%9D%BC%EC%9D%B4%20%EB%AA%A8%EB%91%90%20%EC%A1%B4%EC%9E%AC%ED%95%A0%20%EB%95%8C%20%ED%95%98%EC%9C%84%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EB%A5%BC%20%EB%82%98%EC%97%B4%ED%95%98%EB%A0%A4%EB%A9%B4%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%ED%95%B4%EC%95%BC%20%ED%95%A9%EB%8B%88%EA%B9%8C%3F%20%EA%B7%B8%EB%9F%B0%20%EB%8B%A4%EC%9D%8C%20%EC%B2%98%EC%9D%8C%207%EC%9E%90%EB%A5%BC%20%EA%B8%B0%EC%A4%80%EC%9C%BC%EB%A1%9C%20%EA%B3%A0%EC%9C%A0%ED%95%9C%20%ED%95%98%EC%9C%84%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EB%A5%BC%20%EC%B0%BE%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
아래 예와 같은 내용의 디렉토리가 있습니다. 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의 옵션을 켜서 nullglob
glob 확장과 일치하는 파일이 빈 문자열이 아닌지 확인하세요. 다음으로, 현재 디렉터리의 모든 하위 디렉터리를 반복하고 각 하위 디렉터리에 대해 해당 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/