में स्ट्रिंग की जगह:संशोधित जब मैं <code>xargs</code> उपयोग कर रहा हूँ कभी कभी मैं स्पष्ट रूप से जगह स्ट्रिंग का उपयोग करने की जरूरत नहीं xargs
find . -name "*.txt" | xargs rm -rf
अन्य मामलों में, मैं क्रम जैसी चीज़ें करने में जगह स्ट्रिंग निर्दिष्ट करना चाहते हैं:
find . -name "*.txt" | xargs -I '{}' mv '{}' /foo/'{}'.bar
पिछला आदेश /foo
में वर्तमान निर्देशिका के अंतर्गत सभी पाठ फ़ाइलों को स्थानांतरित होगा और यह सभी फाइलों को विस्तार bar
संलग्न कर देगा।
यदि प्रतिस्थापन स्ट्रिंग में कुछ पाठ जोड़ने की बजाय, मैं उस स्ट्रिंग को संशोधित करना चाहता था जैसे कि मैं फ़ाइलों के नाम और विस्तार के बीच कुछ टेक्स्ट डाल सकता हूं, मैं यह कैसे कर सकता हूं? उदाहरण के लिए, मान लीजिए कि मैं पिछले उदाहरण की तरह ही करना चाहता हूं, लेकिन फ़ाइलों का नाम बदलकर <name>.txt
से /foo/<name>.bar.txt
(/foo/<name>.txt.bar
के बजाय) किया जाना चाहिए।
अद्यतन: मैं एक समाधान खोजने के लिए प्रबंधन:
find . -name "*.txt" | xargs -I{} \
sh -c 'base=$(basename $1) ; name=${base%.*} ; ext=${base##*.} ; \
mv "$1" "foo/${name}.bar.${ext}"' -- {}
लेकिन मुझे आश्चर्य है कि अगर वहाँ एक छोटी/बेहतर समाधान है।
नहीं है, सिवाय इसके कि मैं और अधिक के हवाले से 'mv" $ 1 "" foo/$ {नाम} .bar का प्रयोग करेंगे $ {ext} "' और तुम कर सकते हो '। बेसनाम 'इस तरह: 'आधार = $ {1 ## * /}'। आपको अपना समाधान उत्तर के रूप में पोस्ट करना चाहिए और इसे स्वीकार करना चाहिए। –
@ डेनिसविल्लियमसन आपकी टिप्पणी के लिए धन्यवाद! मैं थोड़ा और इंतजार करूंगा, सिर्फ यह देखने के लिए कि कोई भी कुछ फैंसी चीज के साथ आता है, अन्यथा मैं खुद सवाल का जवाब दूंगा। – betabandido
मुझे लगता है कि यदि आपका फ़ाइल नाम लाइन पर आखिरी चीज है, तो आपको कमांड लाइन में -आई {} और न ही {} की आवश्यकता नहीं है। (ध्यान दें कि xargs का उद्देश्य उद्देश्य समूह के लिए है, इसलिए यदि आप 1 xargs 'तर्क आमंत्रण के अंत में कई चीजें नहीं चाहते हैं तो आपको "-l 1" (या xargs के कुछ संस्करणों के लिए -एल 1) की आवश्यकता है। -आई {} का तात्पर्य है- 1, इसलिए यही कारण है कि यह भी काम करता है।) –