केवल पहले कुछ मिलान वाली फाइल्स का उपयोग करके खोजें?


17

कहते हैं कि *.txtएक निर्देशिका में सैकड़ों फाइलें हो सकती हैं । मैं केवल पहले तीन *.txtफाइलें ढूंढना चाहता हूं और फिर खोज प्रक्रिया से बाहर निकलता हूं ।

findउपयोगिता का उपयोग करके इसे कैसे प्राप्त करें ? मुझे इसके मैन पेज पर एक त्वरित जानकारी मिली, ऐसा कोई विकल्प नहीं था।


3
आप find . -name '*.txt' -print -quitकेवल पहले मैच को दिखाने के लिए उपयोग कर सकते हैं और पहले मैच के findबाद बाहर निकल सकते हैं। मुझे नहीं पता कि क्या मामला "एन मैचों को खोजने के बाद बाहर निकलने" के लिए अनुकूल होना संभव है।
एनएन

जवाबों:


22

आप इसके findमाध्यम से आउटपुट को पाइप कर सकते हैं head:

find . -name '*.txt' | head -n 3

2
मुझे यह पता था, मैं पहले तीन मिलान वाली फ़ाइलों का पता लगाने के बाद खोज प्रक्रिया से बाहर निकलना चाहता हूं। मिलान की गई बड़ी मात्रा में फाइलें हो सकती हैं, जिनकी मुझे परवाह नहीं है।
मित्नक

2
मुझे लगता है कि एक बार सिर ने पहली 3 फाइलों
क्रिस कार्ड

1
हाँ, यह अजीब है, लेकिन आप सही हैं।
मित्नक

19
यह बिल्कुल भी अजीब नहीं है - यह है कि पाइप UNIX में कैसे काम करता है। headशुरू होता है और पाइप के बाईं ओर से इनपुट का इंतजार करता है। फिर findशुरू होता है और उन फाइलों की खोज करता है जो निर्दिष्ट मानदंडों से मेल खाते हैं, पाइप के माध्यम से अपना आउटपुट भेजते हैं। जब headप्राप्त और मुद्रित लाइनों की संख्या का अनुरोध किया जाता है, तो यह पाइप को बंद कर देता है। findबंद पाइप को नोटिस करता है और यह भी समाप्त हो जाता है। सरल, सुरुचिपूर्ण और कुशल।
D_Bye

3
संक्षेप में, -n 3है POSIX संगत है, और इसलिए संभावना अधिक पोर्टेबल होने के लिए।
l0b0

4

यह अन्य उत्तर कुछ हद तक त्रुटिपूर्ण है। आज्ञा है

find . -name '*.txt' | head -n 3

फिर टिप्पणियों में से एक में एक स्पष्टीकरण है [जोर मेरा]:

headशुरू होता है और पाइप के बाईं ओर से इनपुट का इंतजार करता है। फिर findशुरू होता है और उन फाइलों की खोज करता है जो निर्दिष्ट मानदंडों से मेल खाते हैं, पाइप के माध्यम से अपना आउटपुट भेजते हैं। जब headप्राप्त और मुद्रित लाइनों की संख्या का अनुरोध किया जाता है, तो यह पाइप को बंद कर देता है। findबंद पाइप को नोटिस करता है और यह भी समाप्त हो जाता है। सरल, सुरुचिपूर्ण और कुशल

यह लगभग सच है।

समस्या findकेवल बंद पाइप को नोटिस करती है जब वह इसे लिखने की कोशिश करता है - इस मामले में यह तब होता है जब 4 वां मैच मिलता है। लेकिन अगर कोई 4 वां मैच नहीं है तो findजारी रहेगा। आपका खोल इंतजार करेगा! यदि यह एक स्क्रिप्ट में होता है, तो स्क्रिप्ट प्रतीक्षा करेगी, इस तथ्य के बावजूद कि हम पहले से ही जानते हैं कि पाइप आउटपुट अंतिम है और इसमें कुछ भी नहीं जोड़ा जा सकता है। इतना कुशल नहीं।

प्रभाव नगण्य है अगर यह विशेष रूप findसे तेजी से खत्म हो जाता है, लेकिन एक बड़ी फ़ाइल ट्री में जटिल खोज के साथ कमांड अनावश्यक रूप से देरी कर सकती है जो आप आगे करना चाहते हैं।

चलाने के लिए बिल्कुल सही समाधान नहीं है

( find … & ) | head -n 3

इस तरह जब headबाहर निकलता है, तो शेल तुरंत जारी रहता है। पृष्ठभूमि की findप्रक्रिया को नजरअंदाज किया जा सकता है (यह जल्दी या बाद में बाहर निकल जाएगा) pkillया कुछ या के साथ लक्षित ।


उस अवधारणा को सिद्ध करने के लिए जिसे आप खोज सकते हैं /। हम केवल एक मैच की उम्मीद करते हैं, फिर भी findयह हर जगह दिखता है और इसमें काफी समय लग सकता है।

find / -wholename / 2>/dev/null | head -n 1

जैसे ही आप समस्या देखते हैं, इसे Ctrl+ के साथ समाप्त करें C। अब तुलना करें:

pidof find ; ( find / -wholename / 2>/dev/null & ) | head -n 1 ; pidof find
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.