2012-11-23 63 views

回答

123

POSIX 7 solution

find . ! -path . -type d 

對於這種特殊情況下(.),打高爾夫球比mindepth溶液(24比26個字符)好,雖然這可能是稍硬鍵入因爲!

要排除其他目錄,這將高爾夫球較差,並且需要乾燥的變量:

D="long_name" 
find "$D" ! -path "$D" -type d 

!-mindepth之間我的決策樹:

  • 腳本?便攜性使用!
  • 關於GNU的互動會話?
    • exclude .?扔一枚硬幣。
    • 排除long_name?使用-mindepth
+0

如果您需要排除多個路徑,只需執行'find/path /! -path「/ path/first」! -path「/ path/second」'這是唯一的方法嗎? –

+1

@VincentDeSmet你想排除那些路徑,或實際上不會遞歸到他們?如果只是路徑,你可以使用'find /! -regex'/ \(a \ | b \)/.*''或者更簡單地,通過grep管道。爲了不遞歸,以上將是非常低效的,你應該使用'-prune':http://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh –

+0

我的問題如下:我想遞歸刪除除1子目錄以外的目錄中的所有內容。我正在使用'grep'的'find'來排除目錄,但父目錄仍然存在,導致所有內容都被刪除。 –

125

不僅find的遞歸深度可以由-maxdepth參數控制,深度也可以使用相應的-mindepth參數從「top」限制。那麼,什麼人真正需要的是:

find . -mindepth 1 -type d 
+3

作品的GNU找到,但不幸的是GNU擴展到[POSIX 7查找(http://pubs.opengroup.org/onlinepubs/9699919799/utilities/find.html#tag_20_47) ,甚至LSB使用POSIX shell工具(不是GNU擴展工具) –

+3

這對我有用。即:'找。 -mindepth 1 -maxdepth 1 -type d ...' – racl101

+0

良好的觀察和良好的解決方案,歡呼! – PCatinean

16

我用find ./* <...>時,我不介意忽略一級點文件(該*水珠默認情況下不會在bash符合這些 - 看到shopt內建的「dotglob」選項:https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html) 。

 
eclipse tmp # find . 
. 
./screen 
./screen/.testfile2 
./.X11-unix 
./.ICE-unix 
./tmux-0 
./tmux-0/default 
 
eclipse tmp # find ./* 
./screen 
./screen/.testfile2 
./tmux-0 
./tmux-0/default 
+0

供參考。不要在'-exec'選項中使用這個技巧。例如,如果您嘗試'find dir/* -type d -exec rmdir {} \;',您將看到錯誤。 – plhn

+0

你是錯的,或者是錯誤的。該命令將正常工作。如果你看到錯誤,它們將來自'rmdir',並且最有可能告訴你這些目錄不是空的,因爲'find'將在目錄中進行深度優先搜索,向父母顯示他們的子女。 –

+1

你說得對,米洛斯。 – plhn

相關問題