यह xargs कमांड क्यों काम नहीं करता है?


14

मैं सभी .sh एक्सटेंशन को हटाना चाहता था इसलिए ऐसा किया:

ls *.sh | xargs -I {} mv {} `basename {} .sh`

हालाँकि यह काम नहीं करता है, यह basenameरिटर्न अपरिवर्तित फ़ाइल नाम की तरह व्यवहार करता है ।

वह ऐसा व्यवहार क्यों कर रहा है?

उदाहरण के लिए, यह काम करता है:

ls *.sh | xargs -I {} echo `basename {}.jpg .jpg`;

संपादित करें :

समाधान: एकल उद्धरण `basename ...`कमांड चलने से पहले शेल द्वारा मूल्यांकन को रोकता है।

ls *.sh | xargs -I {}  sh -c 'mv {} `basename {} .sh`'

जवाबों:


12

क्योंकि पाइपलाइन चलाने से पहले बेसन कमांड को चलाया जाता है। इस काम को करने के लिए आपको बेसनेम को निष्पादित करने के लिए xargs की आवश्यकता होती है और आप ऐसा कर सकते हैं sh -c, जैसे:

ls *.sh | xargs -L1 sh -c 'basename $1 .sh' dummy

टिप्पणियाँ:

  • यदि आप यह नहीं बताते हैं xargsकि कमांड लाइन के अंत में फ़ाइल नाम कहाँ डालें।
  • आपको -L1स्विच या उसके समतुल्य का उपयोग करना चाहिए , इसलिए xargsकेवल एक तर्क पास करना चाहिए sh
  • के उत्पादन का उपयोग अवांछित प्रभावls हो सकता है ।

संपादित करें

हटाए गए विकल्प हटाए गए, धन्यवाद TechZilla


3
आपका पहला बिंदु गलत है, जब तक कि आपका मतलब यह -iविकल्प से संबंधित डिफ़ॉल्ट नहीं है , लेकिन उन 'क्लासिक' विकल्पों को हटा दिया गया है। उदाहरण के लिए सिर्फ एक विकल्प / लाइन का उपयोग करने के लिए, नया POSIX मैन पेज सुझाता है -L1। के पुराने व्यवहार को कॉल करने के लिए -i, पेज -I'{}'विकल्प की सिफारिश करता है।
जेएम बेकर

तो, वास्तव में इसके बजाय '' "" प्रतीकों के बारे में। मुझे लगता है कि '`के शेल मूल्यांकन को रोकता है। मेरे संपादन देखें।
मेजकिनटोर

@ टेकजिला: सुधार के लिए धन्यवाद। @majkinetor: हाँ और नहीं, आपको मूल्यांकन में देरी करने की आवश्यकता है, लेकिन मुझे नहीं लगता कि आप बैकटिक्स (`) का उपयोग कर सकते हैं।
थोर

1
@majkinetor: आह, मैं देख रहा हूं कि अब आपका क्या मतलब है। इस तरह से फ़ाइलों का नाम बदलने के लिए मैं उपयोग करूँगा rename, जैसे rename 's/\.sh//' *.sh:। ड्राई-रन ( -n) के साथ पहले प्रयास करें ।
थोर

1
@majkinetor: renameमहान काम करता है, और काफी सरल है, लेकिन याद रखें कि यह बहुत ही विशिष्ट वितरण है। आरएचईएल और डेबियन आधारित वितरण अलग-अलग renameकमांड प्रदान करते हैं , इसलिए किसी को क्रॉस-डिस्ट्रो स्क्रिप्ट बनाते समय इसे ध्यान में रखना चाहिए।
जेएम बेकर

4

मैं आपके प्रश्न के बारे में अनिश्चित हूं, क्या आप वास्तव में पूछ रहे हैं कि आपकी पहली पंक्ति काम क्यों नहीं करती है? या आप सभी .sh फ़ाइलों का नाम बदलने के लिए एक उचित विधि की तलाश कर रहे हैं?

यह सबसे साफ तरीका है, मुझे लगता है कि मैं पहले कमांड विकल्प तैयार करना पसंद करता हूं xargs। .Sh फ़ाइल एक्सटेंशन को निकालने के लिए, मैं अक्सर इस दृष्टिकोण पर विचार करता हूं,

 find -maxdepth 1 -type f -iname '*.sh'  | sed 'p;s_.sh$__' | xargs -L2 mv
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.