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