我正在嘗試制定一個命令,該命令可以遞歸地查找僅包含同一層級上的一個或多個目錄的目錄。最好用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
、-mindepth
和-quit
不在 POSIX 中,因此該解決方案可能無法在您的作業系統中運作(-print -quit
只是為了加快速度,您可以省略此片段;-maxdepth 1 -mindepth 1
但這很重要)。
技巧是為每個非空目錄執行單獨的 shell,檢查(非遞歸)該目錄是否不包含任何非目錄。這是用 完成的-exec sh … \;
,它在這裡充當測試。如果目錄不包含任何非目錄則內部的輸出find
為空,因此test( [ -z … ]
)傳回退出狀態0
,sh
傳回0
,-exec
為true。