如何在 Linux 系统上递归查找仅包含文件夹的文件夹?

如何在 Linux 系统上递归查找仅包含文件夹的文件夹?

我正在尝试制定一个命令,以递归方式查找仅包含一个或多个同级目录的目录。最好使用命令find。例如find . -type d

例如,在以下文件结构中:

/tmp/folder1/folder1a/test.jpg
/tmp/folder1/file1a.tmp
/tmp/folder2/folder2a/test.jpg
/tmp/folder3/folder3a/
/tmp/folder3/folder3b/file.jpg

我想打断folder2一下folder3,因为它本身不包含文件,所以它只包含文件夹(带有文件)。

答案1

comm -23 <(find . -type d ! -empty | sort -u) <(find . -type f -printf '%h\n' | sort -u)

这是非空文件夹(其中至少有一个内容)的列表,不包括包含任何文件的文件夹。如果您还想排除管道和符号链接等内容,可以使用! -type d而不是-type f。它不能在单个 find 语句中完成,因为 find 无法匹配复杂的内容条件(这不是 XPath)。

答案2

如果我理解正确的话,应该这样做:

find . -type d ! -empty -exec sh -c '\
[ -z "`find "$1" -maxdepth 1 -mindepth 1 ! -type d -print -quit`" ]\
' sh {} \; -print

由于-empty-maxdepth和不在 POSIX 中,该解决方案可能无法在您的操作系统上运行(只是为了加快速度,您可以省略此片段;-mindepth但很重要)。-quit-print -quit-maxdepth 1 -mindepth 1

诀窍是为每个非空目录运行一个单独的 shell,检查(非递归)目录中是否不包含任何非目录。这是通过 完成的-exec sh … \;,它在这里充当测试。如果目录不包含任何非目录,则内部的输出find为空,因此测试 ( [ -z … ]) 返回退出状态0sh返回0-exec为真。

相关内容