इस / वर्तमान / डॉट फ़ोल्डर को "टाइप डी" से कैसे बाहर रखा जाए


186
find . -type d

कुछ शुरुआती बिंदु के नीचे सभी निर्देशिकाओं को खोजने के लिए इस्तेमाल किया जा सकता है। लेकिन यह वर्तमान निर्देशिका ( .) को भी लौटाता है, जो अवांछित हो सकता है। इसे कैसे बाहर रखा जा सकता है?

जवाबों:


193

POSIX 7 समाधान :

find . ! -path . -type d

इस विशेष मामले ( .) के लिए, गोल्फ mindepthसमाधान (24 बनाम 26 वर्ण) से बेहतर है , हालांकि यह संभवत: टाइप करने के लिए थोड़ा कठिन है !

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

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

मेरे बीच का फैसला पेड़ !और -mindepth:

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

यदि आपको कई रास्तों को बाहर करने की आवश्यकता है तो find /path/ ! -path "/path/first" ! -path "/path/second"क्या यह एकमात्र तरीका है?
विंसेंट डी स्मेट

2
@VincentDeSmet क्या आप केवल उन रास्तों को बाहर करना चाहते हैं, या वास्तव में उनमें पुनरावृत्ति नहीं हुई है? यदि सिर्फ रास्ते, आप उपयोग कर सकते हैं find / ! -regex '/\(a\|b\)/.*'या अधिक बस, grep के माध्यम से पाइप। पुनरावृत्ति न करने के लिए, उपरोक्त बहुत ही अक्षम होगा और आपको इसका उपयोग करना चाहिए -prune: stackoverflow.com/questions/1489277/…
Ciro Santilli 郝海东,,,

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

@VincentDeSmet मैं एक सीधा समाधान नहीं देखता find, आपको उपसर्गों के लिए जाँच करने की आवश्यकता होगी: stackoverflow.com/questions/17959317/… लेकिन लूप के लिए एक बैश इसे संभाल सकता है :-)
सिरो सेंटिल्ली 郝海东 e e e e法轮功

आप शायद विस्मयादिबोधक चार ( \!) को सुरक्षित पक्ष में होने से बचना चाहते हैं । मेरी मशीन के सभी उदाहरण man findबच गए हैं इसलिए ऐसा लगता है कि यह शायद एक अच्छा विचार है। संपादित करें - बस ध्यान से यह भी स्पष्ट रूप से कहते हैं:! expr True if expr is false. This character will also usually need protection from interpretation by the shell.
एड्रियन गुंटर

199

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

find . -mindepth 1 -type d

5
GNU पर काम करता है, लेकिन दुर्भाग्य से POSIX 7 खोज के लिए एक ग्नू एक्सटेंशन है , और यहां तक ​​कि LSB POSIX शेल उपयोगिताओं (GNU विस्तारित वाले नहीं) का उपयोग करता है
Ciro Santilli 郝海东,, 事件 事件

6
इसने मेरे लिए काम किया। अर्थात्:find . -mindepth 1 -maxdepth 1 -type d ...
racl101

19

मैं का उपयोग करें find ./* <...>जब मैं प्रथम स्तर dotfiles (अनदेखी कोई आपत्ति नहीं है *ग्लोब बैश में डिफ़ॉल्ट रूप से इन से मेल नहीं खाता - shopt निर्मित में 'dotglob' विकल्प देखें: https://www.gnu.org/software/bash /manual/html_node/The-hop-Builtin.html )।

ग्रहण tmp # पाएं।
।
./screen
./screen/.testfile2
./.X11-unix
./.ICE-unix
./tmux-0
./tmux-0/default
ग्रहण tmp # खोजें ।/ \ _
./screen
./screen/.testfile2
./tmux-0
./tmux-0/default

FYI करें। -execविकल्प के साथ इस चाल का उपयोग न करें । उदाहरण के लिए, यदि आप प्रयास करते हैं, तो आपको find dir/* -type d -exec rmdir {} \;त्रुटियाँ दिखाई देंगी।
plhn

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

2
नोट: "प्रथम-स्तरीय डॉटफ़ाइल्स की अनदेखी" का अर्थ सभी छिपी हुई फ़ाइलों / निर्देशिकाओं को छोड़कर भी है।
जोनाथन एच

2

खैर, एक सरल समाधान के रूप में अच्छी तरह से (समाधान मेरे लिए काम नहीं कर रहा था git bash)

find * -type d

यह बहुत अच्छा प्रदर्शन नहीं हो सकता है, लेकिन काम हो जाता है, और यह वही है जो हमें कभी-कभी चाहिए।

[संपादित करें]: जैसा कि @AlexanderMills ने टिप्पणी की है कि यह मूल स्थान (जैसे ./.hidden) में छिपी हुई निर्देशिकाओं को नहीं दिखाएगा , लेकिन यह छिपी हुई उपनिर्देशिकाएँ (जैसे। ./folder/.hiddenSub) दिखाएगा । [खिड़कियों पर गिट बैश के साथ परीक्षण]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.