如何在 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

我想繼續說folder2folder3只是因為它本身不包含文件,所以它只包含資料夾(帶有文件)。

答案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-mindepth-quit不在 POSIX 中,因此該解決方案可能無法在您的作業系統中運作(-print -quit只是為了加快速度,您可以省略此片段;-maxdepth 1 -mindepth 1但這很重要)。

技巧是為每個非空目錄執行單獨的 shell,檢查(非遞歸)該目錄是否不包含任何非目錄。這是用 完成的-exec sh … \;,它在這裡充當測試。如果目錄不包含任何非目錄則內部的輸出find為空,因此test( [ -z … ])傳回退出狀態0sh傳回0-exec為true。

相關內容