查找具有 2 个不同扩展名的目录/w 文件

查找具有 2 个不同扩展名的目录/w 文件

所以我正在思考如何才能做到这一点。例如,我可以使用此方法找到文件,但我真正想要的是包含这两种文件类型的目录。有什么想法吗?

另外,我不关心文件名是什么,只关心目录包含一个带有两个扩展名的文件 /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

至少存在两个问题:

  1. -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未找到任何内容,则会发出警告;但这不应破坏逻辑。

  2. 目录名称中的换行符会破坏逻辑。它们会产生误报,使输出不明确。超出其 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'。目录名称中的换行符仍会引起歧义,但至少单个目录名称中的多行将连续出现,正如您期望的那样。

相关内容