linux - ऑपर - लिनक्स के लाभ




लिनक्स मैं rm को परिणाम क्यों नहीं दे सकता? (3)

खेद है कि अगर यह एक noobie सवाल है, लेकिन मैं एक अच्छा जवाब नहीं मिल सकता है।

तब खोजने के लिए मैं कुछ का उपयोग कर सकते हैं हटा दें

find . -name ".txt" -exec rm "{}" \;

लेकिन मैं सिर्फ rm जैसे परिणामों को पाइप क्यों नहीं कर सकता

find . -name ".txt" | rm 

जैसे कि मैं इसे grep करने के लिए पाइप करूंगा

find . -name ".txt" | grep a

मैंने कहीं से पढ़ा है कि rm stdin से इनपुट नहीं लेता है और इसलिए मैं इसे पाइप नहीं कर सकता लेकिन इसका क्या मतलब है? जब मैं rm। Axt में टाइप करता हूं तो यह मानक इनपुट से पढ़ता है जैसे मैं सही कर सकता हूं? या स्टडिन और कमांड लाइन के बीच अंतर है। मदद!


@Alex Gitelman के उत्तर पर विस्तार करने के लिए: हाँ, "मानक इनपुट" और कमांड लाइन के बीच अंतर है।

जब आप rm a.txt b.txt c.txt टाइप rm a.txt b.txt c.txt , तो rm बाद आप जिन फाइलों को rm a.txt b.txt c.txt , उन्हें तर्क के रूप में जाना जाता है और उन्हें एक विशेष चर (जिसे आंतरिक रूप से argv कहा जाता है) के माध्यम से rm को उपलब्ध कराया जाता है। दूसरी ओर, मानक इनपुट, एक यूनिक्स प्रोग्राम की तरह दिखता है, जिसका नाम stdin । एक प्रोग्राम इस "फ़ाइल" से डेटा पढ़ सकता है, जैसे कि यदि वह डिस्क पर एक नियमित फ़ाइल खोले और उसी से पढ़े।

rm , कई अन्य कार्यक्रमों की तरह, कमांड लाइन से अपनी दलीलें लेता है लेकिन मानक इनपुट को नजरअंदाज करता है। आप इसे पसंद करने के लिए कुछ भी पाइप कर सकते हैं; यह सिर्फ उस डेटा को फेंक देगा। xargs काम आता है। यह मानक इनपुट पर लाइनों को पढ़ता है और उन्हें कमांड-लाइन तर्कों में बदल देता है, जिससे आप किसी अन्य प्रोग्राम की कमांड लाइन में प्रभावी रूप से डेटा को पाइप कर सकते हैं। यह एक साफ सुथरी चाल है।

उदाहरण के लिए:

find . -name ".txt" | xargs rm
find . -name ".txt" | grep "foo" | xargs rm  

ध्यान दें कि यह गलत तरीके से काम करेगा यदि कोई भी फ़ाइल नाम है जिसमें newlines या रिक्त स्थान हैं। ऐसे नए नाम या रिक्त स्थान वाले फ़ाइलनामों से निपटने के लिए जिनका आपको उपयोग करना चाहिए:

find . -name ".txt" -print0 | xargs -0 rm

यह एक नई पंक्ति के बजाय एक अशक्त चरित्र के साथ परिणामों को समाप्त find लिए find जाएगा। हालाँकि, grep पहले की तरह काम नहीं करेगा। इसके बजाय इसका उपयोग करें:

find . -name ".txt" | grep "foo" | tr "\n" "\0" | xargs -0 rm

इस बार tr का उपयोग सभी नई लाइनों को अशक्त वर्णों में बदलने के लिए किया जाता है।


पाइप का उपयोग किए बिना एक विकल्प:

xargs rm -f <<< $(find . -name ".txt")

"मैं rm के लिए परिणाम क्यों नहीं खोज सकता?"

जब आप किसी प्रोग्राम में कुछ पाइप करते हैं, तो कीबोर्ड कीबोर्ड इनपुट को बदल देता है। इसे ध्यान में रखें और खुद से अगला सवाल पूछें: कीबोर्ड के साथ rm क्या करेगा? अपने कीस्ट्रोक्स हटाएं? (थोड़ा मूर्खतापूर्ण वास्तव में) इंटरैक्टिव नियंत्रण स्वीकार करना? ( rm इंटरएक्टिव नहीं होता है सिवाय कभी-कभी जब इसे पुष्टि की आवश्यकता होती है, जो वास्तव में एक पाइप द्वारा दिया जा सकता है।)

तथ्य की बात के रूप में, जब rm पहले से ही चल रहा है, तो आप फ़ाइलों को हटाने के लिए कमांड टाइप नहीं कर सकते हैं .... इसलिए आप पाइप के साथ ऐसा नहीं कर सकते।

यदि आप ध्यान रखें कि एक कीबोर्ड कीबोर्ड / स्क्रीन संयोजन की जगह लेता है, तो चीजें तुरंत अधिक तार्किक दिखाई देंगी।

अब दूसरा रास्ता। आप एक डेटास्ट्रीम को grep में पाइप कर सकते हैं। क्या इसका मतलब है कि आप अपने कीबोर्ड से इनपुट डेटा के रूप में कीस्ट्रोक को पढ़ सकते हैं?

हाँ! यह वास्तव में यह देशी (पाइपिंग के बिना) क्या करता है।

(btw ध्यान दें कि आप पाइप नहीं कर सकते और न ही खोज तर्क को grep में टाइप कर सकते हैं)

तो अब आप जानते हैं कि आप rm को पाइप क्यों नहीं कर सकते हैं और यह एक कमांडलाइन तर्क के रूप में काम करने की उम्मीद करते हैं।

tl; डॉआर:

UNIX दर्शन के अनुसार एक कार्यक्रम का एनाटॉमी:
फ़ाइल, फ़ाइल आउट, कीबोर्ड इन, स्क्रीन आउट। -> पाइप केवल कीबोर्ड और स्क्रीन को प्रतिस्थापित करता है।





rm