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