2010-11-24 62 views
33

我想使用GNU find來查找只包含不包含其他目錄但可能包含或不包含常規文件的目錄。使用GNU查找只顯示葉目錄

我最好的猜測至今一直:

find dir -type d \(-not -exec ls -dA ';' \) 

但這只是讓我一個長長的清單「」

謝謝!

+0

當使用-exec中,{}參數擴展到當前路徑檢查文件系統對象(文件/目錄/ ...)。所以你應該使用下面的命令打印目錄: find dir -type d \\(-not -exec ls -dA {} \; \\) – 2010-11-24 17:47:50

+1

oops!我忘了那個。謝謝! – 2010-11-24 18:05:39

回答

59

如果您的文件系統符合POSIX標準,您可以使用-links(例如,目錄中有每個子目錄都有一個鏈接,它的父級鏈接和自我鏈接,因此如果它沒有子目錄)。

下面的命令應該做你想要什麼:

find dir -type d -links 2 

但是,它似乎並不在Mac OS X的工作(如@Piotr mentionned)。這裏是另一個版本是比較慢的,但Mac OS X上它是基於他的版本確實工作,以糾正處理的空白在目錄名稱:

find . -type d -exec sh -c '(ls -p "{}"|grep />/dev/null)||echo "{}"' \; 
1

@Sylvian解決方案並沒有爲我在Mac上工作os x出於一些不明原因。所以我想出了一個更直接的解決方案。希望這會幫助別人:

find . -type d -print0 | xargs -0 -IXXX sh -c '(ls -p XXX | grep/>/dev/null) || echo XXX' ; 

說明:

  • ls -p結束目錄以 '/'
  • 所以(ls -p XXX | grep/>/dev/null)返回0,如果沒有目錄
  • -print0 & & -0是使xargs處理目錄名稱中的空格
0

這個呢?它是可移植的,它不依賴於有趣的鏈接計數。但請注意,將root/folder放在尾部不需要很重要。

find root/folder -type d | awk '{ if (length($0)<length(prev) || substr($0,1,length(prev))!=prev) print prev; prev=($0 "/") } END { print prev }' 
0

這裏是溶液,其在Linux和OS X的工作原理:

find . -type d -execdir bash -c '[ "$(find {} -mindepth 1 -type d)" ] || echo $PWD/{}' \; 

或:

find . -type d -execdir sh -c 'test -z "$(find "{}" -mindepth 1 -type d)" && echo $PWD/{}' \;