2012-11-23 8 views
121
find . -type d 

को खोजने के लिए इस/वर्तमान/डॉट फ़ोल्डर को कैसे निकालें, कुछ प्रारंभ बिंदुओं के नीचे सभी निर्देशिकाओं को खोजने के लिए उपयोग किया जा सकता है। लेकिन यह वर्तमान निर्देशिका (.) भी देता है, जो अवांछित हो सकता है। इसे कैसे बाहर रखा जा सकता है?"टाइप डी"

उत्तर

123

POSIX 7 solution:

find . ! -path . -type d 

इस विशेष मामले (.), mindepth समाधान (24 बनाम 26 वर्ण) की तुलना में बेहतर golfs के लिए, हालांकि यह थोड़ा कठिन शायद है ! की वजह से टाइप करें।

कम अच्छी तरह अन्य निर्देशिकाओं बाहर करते हैं, इस वसीयत गोल्फ और सूखापन के लिए एक चर की आवश्यकता करने के लिए:

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

! और -mindepth के बीच मेरे निर्णय वृक्ष:

  • स्क्रिप्ट? पोर्टेबिलिटी के लिए ! का उपयोग करें।
  • जीएनयू पर इंटरैक्टिव सत्र?
    • . को बाहर करें? एक सिक्का फेंको।
    • long_name को बाहर करें? -mindepth का प्रयोग करें।
+0

यदि आपको एकाधिक पथों को बाहर करने की आवश्यकता है तो बस 'पथ/पथ/करें' करें! -पथ "/ पथ/पहले"! -पथ "/ पथ/दूसरा" 'यह एकमात्र तरीका है? –

+1

@VincentDeSmet क्या आप केवल उन पथों को बाहर करना चाहते हैं, या वास्तव में उन में भर्ती नहीं करना चाहते हैं? यदि पथ हैं, तो आप 'ढूंढें/उपयोग कर सकते हैं! -regex '/ \ (एक \ | बी \) /.*' या अधिक सरल, grep के माध्यम से पाइप। रिकर्स नहीं करने के लिए, उपर्युक्त बहुत अक्षम होगा और आपको '-प्रून' का उपयोग करना चाहिए: http://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh –

+0

मेरा मुद्दा निम्नानुसार था: मैं 1 उप निर्देशिका को छोड़कर निर्देशिका में सबकुछ को दोबारा हटाना चाहता था। मैं निर्देशिका को बाहर करने के लिए 'grep' के साथ' find' का उपयोग कर रहा था लेकिन मूल निर्देशिका अभी भी वहां थी, जिससे सबकुछ हटाया जा सकता था। –

125

न केवल find की रिकर्सन गहराई -maxdepth पैरामीटर द्वारा नियंत्रित की जा सकती है, गहराई को संबंधित -mindepth पैरामीटर का उपयोग करके "शीर्ष" से भी सीमित किया जा सकता है। तो क्या वास्तव में जरूरत है:

find . -mindepth 1 -type d 
+3

काम करता है लगता है, लेकिन दुर्भाग्य से [POSIX 7 खोज] के लिए एक जीएनयू विस्तार है (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/find.html#tag_20_47) , और यहां तक ​​कि एलएसबी भी POSIX खोल उपयोगिताओं का उपयोग करता है (जीएनयू विस्तारित नहीं) –

+3

यह मेरे लिए काम करता है। अर्थात्: 'ढूंढें। -मिन्दपथ 1 -मैक्सडेप 1-प्रकार डी ... ' – racl101

+0

अच्छा अवलोकन और अच्छा समाधान, चीयर्स! – PCatinean

16

मैं find ./* <...> का उपयोग जब मैं अनदेखी प्रथम स्तर dotfiles कोई आपत्ति नहीं है (* ग्लोब बैश में डिफ़ॉल्ट रूप से इन से मेल नहीं खाता - 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' विकल्प के साथ न करें। उदाहरण के लिए, यदि आप 'dir/* -type d -exec rmdir {} \; 'ढूंढने का प्रयास करते हैं, तो आपको त्रुटियां दिखाई देगी। – plhn

+0

आप गलत हैं, या शायद गलत तरीके से गलत हैं। वह आदेश ठीक काम करेगा। यदि आप त्रुटियों को देख रहे हैं, तो वे 'rmdir' से आ रहे हैं और आपको सबसे अधिक संभावना है कि निर्देशिकाएं खाली नहीं हैं क्योंकि' ढूंढ 'निर्देशिकाओं में गहराई से पहली खोज करेगी, जिससे माता-पिता अपने बच्चों के सामने दिखाएंगे। –

+1

आप सही हैं, मिलोस। – plhn