
아래 예와 같은 내용의 디렉토리가 있습니다. 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/