所以我正在思考如何才能做到这一点。例如,我可以使用此方法找到文件,但我真正想要的是包含这两种文件类型的目录。有什么想法吗?
另外,我不关心文件名是什么,只关心目录包含一个带有两个扩展名的文件 /w。
find . -type f \( -name "*.ext1" -or -name "*.ext2" \)
答案1
{ find . -type f -name "*.ext1" -printf "%h\n" | sort -u; find . -type f -name "*.ext2" -printf "%h\n" | sort -u; } | sort | uniq -d
解释:
find ... -printf "%h\n"
打印包含匹配文件的目录;sort -u
删除重复项;find ... | sort -u
两个延伸段各有一根管道;- 最后一个
sort | uniq -d
打印出现多次的行;当且仅当每个都返回目录路径,目录路径才会出现多次find ... | sort -u
。
至少存在两个问题:
-printf
不是 POSIX。该命令的可移植变体可能是:{ find . -type f -name "*.ext1" | xargs -L 1 dirname | sort -u; find . -type f -name "*.ext2" | xargs -L 1 dirname | sort -u; } | sort | uniq -d
xargs
如果find
未找到任何内容,则会发出警告;但这不应破坏逻辑。目录名称中的换行符会破坏逻辑。它们会产生误报,使输出不明确。超出其 POSIX 最低要求的工具可能支持允许您解析以空字符结尾的字符串的选项。这在我的 Debian 中有效:
{ find . -type f -name "*.ext1" -printf "%h\0" | sort -u; find . -type f -name "*.ext2" -printf "%h\0" | sort -z -u; } | sort -z | uniq -z -d
为了获得更易于阅读的格式,请将其通过管道传输到
tr '\0' '\n'
。目录名称中的换行符仍会引起歧义,但至少单个目录名称中的多行将连续出现,正如您期望的那样。