특정 파일 패턴만 포함하고 다른 것은 포함하지 않는 폴더 찾기

특정 파일 패턴만 포함하고 다른 것은 포함하지 않는 폴더 찾기

*.srt 파일만 포함하고 폴더에 다른 파일은 포함하지 않은 모든 폴더를 검색하려면 어떻게 해야 합니까?

답변1

이라는 파일이 포함된 디렉터리를 찾은 *.srt다음 이라는 파일이 포함된 디렉터리를 찾습니다.아니요이름을 지정 *.srt하고 첫 번째 목록에 고유한 디렉터리만 유지합니다.

comm -23 \
<(find . -type f -name \*.srt -printf '%h\n' | sort -u) \
<(find . ! -name \*.srt -printf '%h\n' | sort -u)

답변2

find쉘 사용 bash: 각 디렉토리에 대해 파일 이름이 일치하는지 확인하십시오 *.srt. 그렇다면 해당 이름의 수가 일치하는지 확인하십시오 *. 이 경우 디렉토리 경로를 인쇄하십시오.

find . -type d -exec bash -O nullglob -c '
    for dirpath do
        list1=( "$dirpath"/*.srt )
        if [[ ${#list1[@]} -gt 0 ]]; then
            list2=( "$dirpath"/* )
            if [[ ${#list1[@]} -eq ${#list2[@]} ]]; then
                printf "%s\n" "$dirpath"
            fi
        fi
    done' bash {} +

또는 인라인 스크립트 bash -c에 깊게 중첩되지 않은 경우 :

find . -type d -exec bash -O nullglob -c '
    for dirpath do
        list1=( "$dirpath"/*.srt )
        [[ ${#list1[@]} -eq 0 ]] && continue

        list2=( "$dirpath"/* )
        [[ ${#list1[@]} -ne ${#list2[@]} ]] && continue

        printf "%s\n" "$dirpath"
    done' bash {} +

*.srt두 목록의 길이를 비교하는 대신(배열 저장) 확장된 와일드카드 패턴을 사용하여 일치하지 않는 이름을 일치시킵니다 . 위치 인수 목록을 사용하여 약간의 입력 시간을 절약할 수도 있습니다.

find . -type d -exec bash -O extglob -O nullglob -c '
    for dirpath do
        set -- "$dirpath"/*.srt
        [[ $# -eq 0 ]] && continue

        set -- "$dirpath"/!(*.srt)
        [[ $# -ne 0 ]] && continue

        printf "%s\n" "$dirpath"
    done' bash {} +

관련 정보