我想使用GNU find來查找只包含不包含其他目錄但可能包含或不包含常規文件的目錄。使用GNU查找只顯示葉目錄
我最好的猜測至今一直:
find dir -type d \(-not -exec ls -dA ';' \)
但這只是讓我一個長長的清單「」
謝謝!
我想使用GNU find來查找只包含不包含其他目錄但可能包含或不包含常規文件的目錄。使用GNU查找只顯示葉目錄
我最好的猜測至今一直:
find dir -type d \(-not -exec ls -dA ';' \)
但這只是讓我一個長長的清單「」
謝謝!
如果您的文件系統符合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 "{}"' \;
@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處理目錄名稱中的空格這個呢?它是可移植的,它不依賴於有趣的鏈接計數。但請注意,將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 }'
這裏是溶液,其在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/{}' \;
當使用-exec中,{}參數擴展到當前路徑檢查文件系統對象(文件/目錄/ ...)。所以你應該使用下面的命令打印目錄: find dir -type d \\(-not -exec ls -dA {} \; \\) – 2010-11-24 17:47:50
oops!我忘了那個。謝謝! – 2010-11-24 18:05:39