"खोज" कमांड के आउटपुट पर "बिल्ली" कमांड का उपयोग कैसे करें?


13

मैं findकमांड के आउटपुट को कमांड पर पुनर्निर्देशित करना चाहता हूं catताकि मैं दिए गए फ़ाइल के डेटा को प्रिंट कर सकूं।

इसलिए उदाहरण के लिए यदि खोज का आउटपुट है /aFile/readmeतो बिल्ली की व्याख्या की जानी चाहिए cat ./aFile/readme। मैं तुरन्त ऐसा कैसे कर सकता हूं?

क्या मुझे पाइप का उपयोग करना है?

मैंने इसके संस्करण आज़माए:

cat | find ./inhere -size 1033c 2> /dev/null

लेकिन मुझे लगता है कि यह पूरी तरह से गलत है? बेशक मुझे यकीन है कि आउटपुट केवल एक फाइल है न कि कई फाइलें।

तो मैं ऐसा कैसे कर सकता हूं? मैंने Google पर खोज की है और कोई समाधान नहीं ढूंढ सका, शायद इसलिए कि मैंने सही खोज नहीं की: पी

जवाबों:


21

आप कार्रवाई findका उपयोग करके अकेले ऐसा कर सकते हैं -exec:

find /location -size 1033c -exec cat {} +

{}पाया फ़ाइलों के लिए विस्तारित किया +जाएगा और हमें आह्वान के अनुसार संभव के रूप में कई तर्कों को पढ़ने के लिए सक्षम करेगा cat, क्योंकि बिल्ली कई तर्क ले सकती है।

यदि आपके findपास +एक्सटेंशन नहीं है या आप एक-एक करके फाइलें पढ़ना चाहते हैं:

find /location -size 1033c -exec cat {} \;

यदि आप किसी भी विकल्प का उपयोग करना चाहते हैं cat, तो करें:

find /location -size 1033c -exec cat -n {} +
find /location -size 1033c -exec cat -n {} \;

यहां मैं -nलाइन नंबर प्राप्त करने के विकल्प का उपयोग कर रहा हूं ।


तो, अगर मैं सही हूं: {} एक चर की तरह है जो इसमें खोज कमांड का आउटपुट संग्रहीत है और "+" चिह्न के बाद आप बिल्ली पैरामीटर लिखने वाले हैं? नहीं ? संपादित करें: ठीक है आपने अपनी पोस्ट संपादित की और अब आपने मेरे प्रश्न का उत्तर दिया: पी थैंक्स मैन! हल किया !
एकापसी

@ general656 मेरे संपादन की जाँच करें ..
heemayl

1
तथ्य यह है कि मैं के बारे में पता नहीं था catकी -nविकल्प मुझे तो हैरानी। मुझे बेतरतीब सवाल पढ़ना अच्छा लगता है।
mazunki

1

कमान प्रतिस्थापन

एक अन्य विकल्प कमांड प्रतिस्थापन का उपयोग करना है । कमांड को लपेटने से कमांड $()चलेगी और कमांड को उसके आउटपुट से बदल देगी।

cat $(find ./inhere -size 1033c 2> /dev/null)

हो जाएगा

cat ./inhere/file1 .inhere/file3

यह कम या ज्यादा समतुल्य पुरानी शैली का उपयोग करने के लिए वापस टिक के साथ कमांड लपेटने के लिए है:

cat `find ./inhere -size 1033c 2> /dev/null`

ऊपर दिए गए डॉक्स से अधिक जानकारी

बैश एक उप-वातावरण में कमांड निष्पादित करके और कमांड के प्रतिस्थापन को कमांड आउटपुट के साथ आउटपुट के कमांड को निष्पादित करता है, जिसमें किसी भी नए ट्रेसिंग को हटा दिया जाता है। एंबेडेड न्यूलाइन्स को हटाया नहीं जाता है, लेकिन शब्द विभाजन के दौरान उन्हें हटा दिया जा सकता है। कमांड प्रतिस्थापन $(cat file)को समकक्ष लेकिन तेजी से बदला जा सकता है $(< file)

जब प्रतिस्थापन के पुराने-शैली बैकक्वाटर फॉर्म का उपयोग किया जाता है, तो बैकस्लैश इसके शाब्दिक अर्थ को बरकरार रखता है $, जब इसके बाद `, या \। बैकस्लैश से पहले नहीं लिया गया पहला बैककॉइन कमांड प्रतिस्थापन को समाप्त करता है। $(command)प्रपत्र का उपयोग करते समय , कोष्ठकों के बीच के सभी अक्षर कमांड बनाते हैं; किसी के साथ विशेष व्यवहार नहीं किया जाता है।

आदेश प्रतिस्थापन को नेस्टेड किया जा सकता है। बैककोट फॉर्म का उपयोग करते समय घोंसला बनाने के लिए, बैकस्लैश के साथ आंतरिक बैकक्वाट्स से बचें।

यदि प्रतिस्थापन डबल कोट्स के भीतर दिखाई देता है, तो शब्द विभाजन और फ़ाइल नाम का विस्तार परिणामों पर नहीं किया जाता है।

उपयोग के कुछ अच्छे उदाहरणों के लिए यह अन्य उत्तर देखें ।


ध्यान दें कि यदि findबहुत अधिक फाइलें मिलती हैं, तो यह एक "तर्क सूची बहुत लंबी" त्रुटि उत्पन्न करने की कोशिश कर रहा होगा cat। इसमें व्हॉट्सएप कैरेक्टर वाले फाइलनेम को हैंडल करने में भी दिक्कतें आती हैं और संभवत: फाइलनाम ग्लोबबिंग कैरेक्टर वाले फाइलनेम भी होते हैं।
कुसलानंद

-1

यह पाठ (ascii) फ़ाइलों के नाम और सामग्री को केवल पुनरावर्ती रूप से मुद्रित करेगा।

find . -type f -exec grep -Iq . {} \; -print | xargs awk 'FNR==1{print FILENAME ":" $0; }'

एक और कोशिश

find . -type f -exec grep -Iq . {} \; -printf "\n%p:" -exec cat {} \;

-2

पाइप और xargs का उपयोग करें

find /* -name pg_hba.conf | xargs cat

यदि यह अनुमतियों की कमी के कारण विफल हो जाता है, तो आप यह सुनिश्चित करने के लिए sudo का उपयोग कर सकते हैं कि आपके पास जिस निर्देशिका को आप खोज रहे हैं, उस पर कमांड को निष्पादित करने की अनुमति है।

 sudo find /* -name pg_hba.conf | xargs sudo cat

1
और अगर किसी ने एक फाइल बनाई है /tmp/ /dev/urandom /pg_hba.conf, जो रूट को पूरी सामग्री को डंप करने देगी /dev/urandom। संदर्भ के आधार पर इससे भी बदतर हो सकता है। xargsलगभग -0सभी का उपयोग नहीं किया जाना चाहिए अगर बिल्कुल नहीं। से भी sudo xargsबेहतर होगा xargs sudo। और के /*रूप में बेहतर होगा /
स्टीफन चेज़लस

1
ओपी stdout पर फ़ाइल सामग्री मुद्रित करने के लिए बिल्ली का उपयोग करना चाहता है। तो उद्देश्य बिल्ली द्वारा परोसा जाता है। सवाल यह है कि फ़ाइल की सामग्री को प्रिंट करने के लिए बिल्ली के बाहर से बिल्ली का उपयोग कैसे करें सूडो या खोजने के लिए उपयोग नहीं करें, उपरोक्त आदेश प्रश्न हल करता है। हाँ xargs -0 एकमात्र रचनात्मक चीज़ थी जिसे आपने इंगित किया था। लेकिन उपयोग नहीं दिखा। अशिष्ट नहीं होने का प्रयास करें।
ऐप काम

क्षमा करें यदि वह अशिष्ट दिखाई दिया। वह इरादा नहीं था। मैं सीमाओं को इंगित करना चाहता था। आपका जवाब बुरी प्रथाओं को दिखाता है ( find|xargsबिना -0वास्तव में प्रतिबंध लगाए), इसलिए नीचे वोट। इसके findबिना आउटपुट -print0विश्वसनीय ढंग से पोस्ट-प्रोसेस करने योग्य नहीं है। -print0मानक नहीं है। कहा जाता है कि, मानक sudo find / -name pg_hba.conf -exec cat {} +आपको सामग्री की डंपिंग भी कर सकता है /dev/urandom(उदाहरण के लिए अगर किसी ने इससे एक सिमलिंक बनाया है /tmp/pg_hba.confऔर इसके आसपास कोई आसान पोर्टेबल तरीका नहीं है जो कम से कम एक दौड़ की स्थिति नहीं है)।
स्टीफन चेज़लस

1
चलो sudo"सिर्फ मामले में" का उपयोग नहीं करेंगे, क्या हम?
21

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