我正在尝试制定一个命令,以递归方式查找仅包含一个或多个同级目录的目录。最好使用命令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 … ]
) 返回退出状态0
,sh
返回0
,-exec
为真。