मैं बैश करने के लिए अपेक्षाकृत नया हूं और कुछ ऐसा करने की कोशिश कर रहा हूं, जो सतह पर बहुत सीधा-सा लग रहा था - एक निर्देशिका पदानुक्रम पर सभी * .wma फ़ाइलों को प्राप्त करने के लिए रन करें, उस आउटपुट को एक कमांड पर पाइप करें जहां मैं उन्हें एमपी 3 में परिवर्तित करता हूं। रूपांतरित फ़ाइल को .mp3 पर सहेजें। मेरी सोच यह थी कि कमांड निम्नलिखित की तरह दिखना चाहिए (मैंने ऑडियो रूपांतरण कमांड को छोड़ दिया है और उदाहरण के लिए प्रतिध्वनि का उपयोग कर रहा हूं):
$ find ./ -name '*.wma' -type f -print0 | xargs -0 -I f echo ${f%.*}.mp3
जैसा कि मैं इसे समझता हूं, -print0 arg मुझे उन फ़ाइलनामों को संभालने देगा जिनके पास रिक्त स्थान हैं (जो इनमें से कई करते हैं क्योंकि वे संगीत हैं)। मैं तब (xargs के परिणामस्वरूप) उम्मीद कर रहा हूं कि खोजने से प्रत्येक फ़ाइल पथ f में कैप्चर किया गया है, और स्ट्रिंग के अंत से सबस्ट्रिंग मैच / डिलीट का उपयोग करते हुए, कि मुझे मूल फ़ाइल पथ को एक एमपी 3 के साथ गूंजना चाहिए अर्थोपाय अग्रिम के बजाय। हालाँकि, इस परिणाम के बजाय, मैं निम्नलिखित देख रहा हूँ:
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
...
तो मेरा सवाल (विशिष्ट से अलग 'मैं यहाँ क्या गलत कर रहा हूँ'), यह है - वे मान जो एक पाइप ऑपरेशन के परिणाम हैं, उन्हें स्ट्रिंग हेरफेर संचालन में अलग-अलग व्यवहार करने की आवश्यकता होती है, जो कि एक चर असाइनमेंट का परिणाम है। ?
{}
सदस्य)
xargs
की तुलना में अधिक उपयुक्त है exec
। इस stackpost देखें stackoverflow.com/questions/896808/find-exec-cmd-vs-xargs बिंदु में एक मामले के लिए।
xargs
साथ उपयोग करने का कोई कारण नहीं हैfind
। यह एक-exec
विकल्प के साथ आता है । क्या आप अपने आदेश का उपयोग केवल अपने प्रश्न में करने के लिए कर सकते हैं, और कोई आपको सहीfind
आदेश दिखा सकता है ?