查找所有只包含一种文件类型的目录

查找所有只包含一种文件类型的目录

给定文件类型 .txt,查找仅包含该类型文件的所有目录。

例如

a--
   b-- 1.txt
   c--
      |
       ---- 2.jpg
       ---- 3.txt

该命令应该只输出bnot c

答案1

find . -type d -execdir sh -c '
   [ "$(find "$1" -maxdepth 1 -type f -name "*.txt" -print -quit | wc -l)" -gt 0 ] &&
   [ "$(find "$1" -maxdepth 1 -type f ! -name "*.txt" -print -quit | wc -l)" -eq 0 ]
   ' find-sh {} \; -print

外部find提供要检查的目录。两个内部-s 检查目录中find是否至少有一个.txt文件且没有非文件。shell 使用和实现逻辑。.txtsh[ … ]&&

笔记:

  • -maxdepthPOSIX 不要求这样做。有关 POSIX 方法,请参阅这个问题
  • -quitPOSIX 并不要求。此操作会find在报告任何匹配文件后立即退出。这很有用,因为我们最多需要一个匹配的文件来获得结果wc -l[ … ]因此尽早退出可以节省时间。没有-quit整个命令也可以工作,只是在文件很多时会变慢。或者,您可以使用find … | head -n 1 | wc -l;在这种情况下,head将在找到第一个文件后终止管道,wc将立即产生结果,但find只有在(如果)它尝试写入时才会注意到管道损坏完后还有行。这是一种权衡:head可能会节省一些时间和资源,但(作为单独的过程)它需要时间和资源在每个目录中生成两次。
  • 带有换行符的路径(如果有)会被欺骗wc -l,但这并不重要,因为这些额外的换行符仅在“正确”计数非零时才可能添加到计数中,并且我们只需要知道结果是否为零。

相关内容