क्या किसी पाइप में xargs का उपयोग करने का कोई तरीका है?


15

मैं स्वचालित रूप से flac फ़ाइलों को एक फ़ोल्डर में एमपी 3 में स्थानांतरित करने की कोशिश कर रहा हूं।

कोड की मेरी वर्तमान रेखा यह है:

inotifywait -m -r -q -e moved_to --format "'%w%f'" ~/test |  xargs -I x flac -cd x - | lame -b 320 - /media/1tb/x.mp3

यह बताने के लिए कि यह अब तक कैसे काम करता है, inotifywait मॉनिटर ले जाता है ~ / पुनरावर्ती रूप से फ़ाइलों को वहां ले जाने के लिए, पथ और फ़ाइल नाम को एक पाइप पर आउटपुट करता है। xargs उस नाम को लेता है और उचित flac कमांड बनाता है, x को फाइलनाम के साथ बदलकर फाइल को दूसरे पाइप में डिकोड करता है। नए पाइप में लंगड़ा एमपी 3 के तहत / मीडिया में flac के आउटपुट को संसाधित करता है। मैं चाहता हूं कि xargs या तो किसी तरह से पाइप के पार पहुंच जाए, x को लंगड़ी कमांड में बदल दे या किसी तरह से इसे वैरिएबल में भेज दे, दोनों कमांड एक्सेस या कुछ और कर सकते हैं। मैंने नामित पाइपों और उस जैज के साथ खिलवाड़ करने की कोशिश की, लेकिन यह तथ्य कि दो कमांडों के बीच पाइप किए जाने के वास्तविक आंकड़े मेरे सिर के ऊपर हैं।

जवाबों:


16

अगर मैं सही तरीके से समझूं, तो आप flac … | lame …प्रत्येक इनपुट लाइन के लिए एक उदाहरण देना चाहते हैं , और इनपुट को दोनों कमांड्स के तर्कों में बदल सकते हैं।

चूंकि आपको xargsपाइपलाइन शुरू करने की आवश्यकता है, इसलिए आपको इसे एक कार्यक्रम शुरू करने की आवश्यकता है जो पाइपलाइन बनाने में सक्षम है, अर्थात एक शेल।

inotifywait -m -r -q -e moved_to --format "%w%f" ~/test |
xargs -l sh -c 'flac -cd "$0" - | lame -b 320 - "/media/1tb/$0.mp3"'

वैकल्पिक रूप से, कॉलिंग शेल को एक-एक करके लाइनें पढ़ें और पाइपलाइन चलाएं।

inotifywait -m -r -q -e moved_to --format "%w%f" ~/test |
while IFS= read -r file; do
  flac -cd "$file" - | lame -b 320 - "/media/1tb/$file.mp3"
done

ध्यान दें कि प्रारूप %w%fएक निरपेक्ष पथ का निर्माण करता है, जिसके लिए आप तैयार /media/1tbऔर संलग्न हैं .mp3। यदि आप lameकमांड में फ़ाइल के निर्देशिका भाग को बंद करना चाहते हैं , तो बदल $fileदें ${file##*/}। यदि आप एक्सटेंशन को अलग करना चाहते हैं, तो बदल $fileदें ${file%.*}। यदि आप दोनों करना चाहते हैं, तो आपको इसे दो चरणों में करना होगा। यदि आप के तहत निर्देशिका पदानुक्रम को पुन: उत्पन्न करना चाहते हैं /media/1tb, तो आप उपयोग कर सकते हैं mkdir -p

cd ~/test
inotifywait -m -r -q -e moved_to --format "%w%f" . |
while IFS= read -r file; do
  [ -f "$file" ] || continue; # skip directories and other special files
  dir=${file%/*}; file=${file##*/}
  mkdir -p "/media/1tb/$dir"
  flac -cd "$dir/$file" - | lame -b 320 - "/media/1tb/$dir/${file#.*}.mp3"
done

3

आप कुछ इस तरह की कोशिश कर सकते हैं:

inotifywait -m -r -q -e moved_to --format "'%w%f'" ~/test \
    | while read x; do \
        flac -cd "$x" - | lame -b 320 - "/media/1tb/$x.mp3"
    done;

1
while read …एक समाधान है, लेकिन फिर, ड्रॉप xargs। आपने जो लिखा है उसका कोई मतलब नहीं है: आपको क्या लगता xargsहै कि इसका इनपुट मिल रहा है? और आपको चीजों को ठीक से उद्धृत करना चाहिए, संगीत फ़ाइल नामों के लिए रिक्त स्थान होना आम है।
गिलेस एसओ- बुराई को रोकना '

@ गाइल्स यह मेरे लिए बिल्कुल स्पष्ट नहीं था कि ओपी क्या कर रहा है, यही कारण है कि मैंने कहा "आप कुछ इस तरह की कोशिश कर सकते हैं " और "मुझे यकीन नहीं है कि अगर xargs बिट आपके इरादों के लिए सच है" आदि। तो सबसे अच्छा जवाब नहीं है लेकिन सही दिशा में एक संकेत है, मुझे लगता है। उद्धरण समस्या को ठीक कर लिया है और xargs को हटा दिया है।
गोल्डीलॉक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.