2013-01-03 24 views
61

मैं _peaks.bed के साथ समाप्त होने वाली फ़ाइलों को ढूंढना चाहता हूं, लेकिन tmp और scripts फ़ोल्डरों में फ़ाइलों को बाहर निकालना चाहता हूं।खोज कमांड का उपयोग करें, लेकिन दो निर्देशिकाओं में फ़ाइलों को बाहर निकालें

मेरे आदेश इस तरह है:

find . -type f \(-name "*_peaks.bed" ! -name "*tmp*" ! -name "*scripts*" \) 

लेकिन यह काम नहीं किया। tmp और script फ़ोल्डर में फ़ाइलें अभी भी प्रदर्शित की जाएंगी।

क्या किसी के पास इसके बारे में कोई विचार है?

उत्तर

142

यहाँ आप कैसे निर्दिष्ट कर सकते हैं कि find साथ:

find . -type f -name "*_peaks.bed" ! -path "./tmp/*" ! -path "./scripts/*" 

स्पष्टीकरण:

  • find . - वर्तमान कार्यशील निर्देशिका (रिकर्सिवली डिफ़ॉल्ट रूप से)
  • -type f से खोजने के प्रारंभ - करने के लिए निर्दिष्ट करें find कि आप केवल
  • में फ़ाइलों को चाहते हैं
  • -name "*_peaks.bed" - नाम _peaks.bed
  • ! -path "./tmp/*" में समाप्त होने के साथ फ़ाइलों के लिए देखो - जिसका पथ ./tmp/
  • ! -path "./scripts/*" साथ शुरू होता है सभी परिणाम को शामिल न करें - जिसका पथ ./scripts/

परीक्षण समाधान के साथ शुरू होता सभी परिणाम भी बाहर निकालने के :

$ mkdir a b c d e 
$ touch a/1 b/2 c/3 d/4 e/5 e/a e/b 
$ find . -type f ! -path "./a/*" ! -path "./b/*" 

./d/4 
./c/3 
./e/a 
./e/b 
./e/5 

आप थे बहुत करीब, -name विकल्प केवल basename, जहां के रूप में -path पूरे पथ पर विचार करता है =)

+0

अच्छा काम। हालांकि, आप '_peaks.bed'' के साथ समाप्त होने वाली फ़ाइलों को ढूंढने के लिए ओपी की इच्छाओं में से एक भूल गए थे। – alex

+0

@alex doh, अच्छी कॉल! निश्चित =) –

+2

यह जीएनयू 'खोज 'में कई एक्सटेंशन का उपयोग करता है, लेकिन चूंकि सवाल लिनक्स टैग किया गया है, यह कोई समस्या नहीं है। अच्छा उत्तर। –

7

यहाँ एक तरह से आप यह कर सकता है ...

find . -type f -name "*_peaks.bed" | egrep -v "^(./tmp/|./scripts/)" 
+2

यह की योग्यता है जीएनयू 'ढूंढ 'के बजाए,' ढूंढ 'के किसी भी संस्करण के साथ काम करना। हालांकि, सवाल लिनक्स को टैग किया गया है, इसलिए यह महत्वपूर्ण नहीं है। –

0

तरह

find . \(-type f -name \*_peaks.bed -print \) -or \(-type d -and \(-name tmp -or -name scripts \) -and -prune \) 

कुछ की कोशिश करो और अगर मैं इसे एक सा गलत भी तो हैरान न हों है। यदि लक्ष्य एक निष्पादन (प्रिंट के बजाय) है, तो बस इसे जगह में बदलें।

0
मेरे लिए

समझता है, इस समाधान खोजने के साथ एक कमांड कार्यकारी पर काम किया नहीं था, वास्तव में नहीं जानता कि क्यों, मेरे समाधान तो है

find . -type f -path "./a/*" -prune -o -path "./b/*" -prune -o -exec gzip -f -v {} \; 

स्पष्टीकरण: ही

-prune के परिवर्धन के साथ सैम्पसन-chen एक के रूप में - के proceding पथ पर ध्यान न दें ...

-ओ - तो फिर यदि कोई मुकाबला परिणाम प्रिंट, (निर्देशिका छाँटना और शेष परिणामों को मुद्रित)

18:12 $ mkdir a b c d e 
18:13 $ touch a/1 b/2 c/3 d/4 e/5 e/a e/b 
18:13 $ find . -type f -path "./a/*" -prune -o -path "./b/*" -prune -o -exec gzip -f -v {} \; 

gzip: . is a directory -- ignored 
gzip: ./a is a directory -- ignored 
gzip: ./b is a directory -- ignored 
gzip: ./c is a directory -- ignored 
./c/3: 0.0% -- replaced with ./c/3.gz 
gzip: ./d is a directory -- ignored 
./d/4: 0.0% -- replaced with ./d/4.gz 
gzip: ./e is a directory -- ignored 
./e/5: 0.0% -- replaced with ./e/5.gz 
./e/a: 0.0% -- replaced with ./e/a.gz 
./e/b: 0.0% -- replaced with ./e/b.gz 
+0

स्वीकृत उत्तर काम नहीं करता था, लेकिन यह काम करता है। प्रुन का उपयोग करके, 'ढूंढें। -path ./scripts -prune -name' * _peaks.bed '-type f'। सुनिश्चित करें कि एकाधिक निर्देशिकाओं को कैसे बाहर निकालना है। यह शीर्ष स्तर को भी सूचीबद्ध करता है 'टाइप' निर्दिष्ट होने के बावजूद बहिष्कृत निर्देशिका। Grep के माध्यम से छोड़कर अधिक सरल लगता है जब तक कि आप प्रुन का उपयोग नहीं करना चाहते खोज ऑपरेशन को तेज करने के लिए। – Mohnish

0

आप नीचे दिए गए कोशिश कर सकते हैं:

find ./ ! \(-path ./tmp -prune \) ! \(-path ./scripts -prune \) -type f -name '*_peaks.bed' 
+1

उस तरह के पुराने प्रश्न पर (4 साल!) आप यह बताने के लिए चाहते हैं कि यह नया उत्तर क्यों बेहतर या अलग है, न केवल "डंप" कोड। – Nic3500

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^