एकाधिक फ़ाइल एक्सटेंशन के लिए `find` का उपयोग करना


16

मैं JAVA फ़ाइलों में पाठ की पंक्तियों को गिनने के लिए निम्नलिखित कमांड का उपयोग कर रहा हूं:

find . -name '*.java' | xargs wc -l

मैं findएक से अधिक फ़ाइल एक्सटेंशन से मिलान करने के लिए कमांड मापदंडों को कैसे संशोधित कर सकता हूं ? उदाहरण के लिए, मैं सीपीपी, सी और एच फाइलों के लिए उपरोक्त ऑपरेशन का उपयोग करना चाहूंगा।


यह प्रश्न वास्तव में findकमांड के बारे में है , क्योंकि यह वह जगह है जहाँ आप मिलान फ़ाइलों की खोज कर रहे हैं।
iglvzx

1
इसके अलावा, find -print0 | xargs -0निर्माण या तो बेहतर और सरल का उपयोग करें find . -name '*.cpp' -o -name '*.c' -o -name '*.h' -exec wc -l {} +:। यह किसी भी फ़ाइल नाम के मुद्दों (रिक्त स्थान, नई लाइनें और इतने पर) से बच जाएगा और (बहुत) अच्छा कस्टम है।
डैनियल एंडर्सन

जवाबों:


16

-oOR के लिए विकल्प का उपयोग करें । उदाहरण के लिए, इस सूची जाएगा .cpp, .cऔर .hफ़ाइलें:

find . -name \*.cpp -o -name \*.c -o -name \*.h

आह। *यदि कोड में प्रारूपित अब जरूरतों भाग निकले किया जाना है। पूरी तरह से नजरअंदाज कर दिया। :)
iglvzx

हां, इसमें दो लोगों द्वारा तीन संपादन किए गए लेकिन हमें मिल गया।
JOTN

2
यह मेरे लिए OSX पर काम नहीं करता था (केवल अंतिम -नाम * .ext से मेल खाता था) - मुझे नीचे @smokinguns द्वारा सुझाए गए कोष्ठक का उपयोग करना था।
गिलियड

2

आपको -o विकल्प का उपयोग करना होगा। उदाहरण के लिए नीचे दिए गए विवरण में सभी png, jpg और gif फ़ाइलों को एक फ़ोल्डर में पाया गया है।

find . \( -iname \*.png -o -iname \*.jpg -o -iname \*.gif \)

मैं -iname विकल्प का उपयोग करता हूं ताकि मैच असंवेदनशील हो।


1
iname खोज के सभी संस्करणों पर उपलब्ध नहीं है।
JOTN

2
$ find /path/ -name '*.cpp' -or -name '*.c' -or -name '*.h'

"-Or" कहता है कि मैं दो सेटों में से किसी एक / दोनों की तलाश में हूं।

मैंने हाल ही में बूलियन ऑपरेटरों के साथ खोज का उपयोग करने के लिए एक त्वरित गाइड लिखा है: http://jamesfishwick.com/2012/linux-find-and-boolean-operators


1

जबकि सभी उत्तर कमोबेश एक जैसे हैं, मैं उन्हें बहु-नाम और बूलियन ऑपरेटरों के बीच पढ़ने योग्य नहीं पाता।

मुझे लगता है कि यह अधिक सुरुचिपूर्ण समाधान हो सकता है:

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$"

चलो इसे तोड़ो

  • find . वर्तमान पथ में सभी फ़ाइलों को पुन: खोजता है (यदि आपको आवश्यकता हो तो किसी अन्य पथ में परिवर्तन करें)
  • -type fफ़ाइलों को केवल खोज करता है (गति का बहुत अधिक नहीं, लेकिन फिर भी ...)
  • | grep -Eमैंने इसका इस्तेमाल मैक OS X में grep पहचान या ( |) ऑपरेटर के लिए किया है जो FreeBSD grep का उपयोग करता है , GNU grep को इसकी आवश्यकता नहीं है (आपकी manफ़ाइल में जाँच करें )।
  • "\.java$|\.cpp$|\.c$"नियमित अभिव्यक्ति जो फ़ाइलों जिसका शामिल नाम समाप्त होता है के साथ .java, .cppऔर .c(ऐड जिनकी आपको आवश्यकता)

फिर आप आगे की प्रक्रिया के लिए परिणामी सूची को पाइप कर सकते हैं, जैसे

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$" | xargs sed -i '' $'/s/\r$//'

यह उदाहरण CRLFओएस एक्स / लिनक्स के लिए समाप्त हो रही डॉस / विंडोज लाइन को हटाता है LF(यह ओएस एक्स sedसिंटैक्स भी है , आपके संस्करण की बारीकियों के लिए जांच करें)।


मैं 25 विभिन्न एक्सटेंशन मिलान मापदंडों का उपयोग करके सभी वीडियो फ़ाइल प्रकारों को ढूंढना चाहता था। यह एकमात्र तरीका था जिसने मेरे लिए काम किया। (उबंटू 14.04 एलटीएस)
एल्डर गीक

0

उपयोग

find path/to/dir -name "*.ext1" -o -name "*.ext2"

व्याख्या

  1. पहला पैरामीटर वह निर्देशिका है जिसे आप खोजना चाहते हैं।
  2. डिफ़ॉल्ट रूप findसे पुनरावर्तन करता है।
  3. -oके लिए खड़ा है -or। तो ऊपर इस वाइल्डकार्ड या यह एक के लिए खोज का मतलब है। यदि आपके पास केवल एक पैटर्न है तो इसकी कोई आवश्यकता नहीं है -o
  4. वाइल्डकार्ड पैटर्न के आसपास के उद्धरण आवश्यक हैं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.