लिनक्स में फाइलें ढूंढें और विशिष्ट निर्देशिकाओं को बाहर करें


14

मैं इस तरह एक लग रही है:

rm -f crush-all.js
find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | while read line
do
   cat "$line" >> crush-all.js
   echo >> crush-all.js
done

मैं खोजने में "परीक्षण" नामक एक निर्देशिका को बाहर करने के लिए जोड़ना चाहता हूं, लेकिन मुझे यह पता नहीं लग सकता है कि किसी भी तरह "-Type" को कैसे जोड़ा जाए। मैं ऐसा करने के बारे में कैसे जाना होगा?

धन्यवाद!

जवाबों:


22

आप ऑपरेटर के -pathसाथ इसे खोजने और संयोजन करने के लिए विकल्प का उपयोग कर सकते हैं -not

find . ! -path "*/test/*" -type f -name "*.js" ! -name "*-min-*" ! -name "*console*"

कृपया दो बातों पर ध्यान दें

  • -path पहले तर्क के रूप में आना चाहिए
  • पैटर्न पूरे फ़ाइल नाम से मेल खाता है, इसलिए -path testकभी भी, कुछ भी मेल नहीं खाएगा

वैसे, मुझे यकीन नहीं है कि आप कोष्ठक का उपयोग क्यों कर रहे हैं, इससे कोई फर्क नहीं पड़ता। इसका उपयोग केवल पूर्ववर्ती के लिए किया जाता है, जैसे निर्माण के लिए ! \( -name '*bla*' -name '*foo*' \)(अर्थात, उन चीजों को नहीं खोजें जिनके पास दोनों हैं blaऔर foo)।

एक और शोधन: बैश लूप का उपयोग करने की आवश्यकता नहीं है, आप बस कर सकते हैं

find . ... -exec cat {} \; -exec echo \;

कहाँ ... करने के लिए अन्य तर्क हैं find


2
find / -path ./test -prune -o ...

./testआप परीक्षण निर्देशिका का स्थान फिट करने के लिए नाम बदलें ।


2
इस स्थिति में, ऐड -प्रिंट एक्शन को न भूलें (क्योंकि -प्रिंट डिफॉल्ट एक्शन नहीं है) -ओ विकल्प के बाद
बिल झाओ

1

आप इस तरह grep के साथ कोशिश कर सकते हैं (यहाँ फ़ोल्डर का नाम test_folder है):

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/path/to/test_folder/" | while read line

या यदि आपका पता सापेक्ष पथ देता है:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "./relative_path/to/test_folder/" | while read line

या यदि आप सभी फ़ोल्डर चाहते हैं जिनका नाम समान है लेकिन अलग-अलग पथ के साथ है

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/test_folder/" | while read line

सादर,


1

मुझे लगता है कि @CharlesClavadetscherउसके जवाब के लिए क्या हो रहा था, इसका विस्तार करने के लिए। यदि आप किसी पथ को छोड़ते हैं, तो आप मार्ग को -not -path ... findछोड़ते रहेंगे। इसके बजाय, उपयोग -pruneकरने से यह आगे की ओर छोड़ा हुआ मार्ग में उतरने से रोक देगा, जिससे यह तेज़ हो जाएगा। तो आप कुछ ऐसा कर सकते हैं

find . -path '*test/*' -prune -o -type f -name "*.js" ! -name "*-min*" ! -name "*console*" -print

0

जब मैं सिर्फ एक फ़ाइल की खोज कर रहा होता हूं तो मैं "व्होलोनेम" का उपयोग नहीं करता हूं। -name वास्तविक फ़ाइल नाम का परीक्षण करती है, लेकिन -wholename पूरा पथ परीक्षण करती है। तो ऊपर दिए गए प्रश्न के परीक्षण के लिए एक उपेक्षा जोड़ना:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) ! -wholename "*test*"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.