查找包含特定文件模式但不包含其他内容的文件夹

查找包含特定文件模式但不包含其他内容的文件夹

如果我想搜索仅包含 *.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

使用findshell 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 {} +

相关内容