मैं xargs के साथ एक बार में दो मापदंडों का उपयोग कैसे कर सकता हूं?


18

मुझे वीडियो परिवर्तित करने की आवश्यकता है, लेकिन मुझे नहीं पता कि वे कहां हैं, इसलिए मुझे findउनकी आवश्यकता है । मैं FFmpeg के साथ परिणाम और आउटपुट फ़ाइल नाम कैसे दे सकता हूं xargs?

मुझे पहले ही पता चला कि मैं इस कमांड के साथ दो मापदंडों का निर्माण कर सकता हूं:

find . -iname "*.mov" -printf "%p %f\n"

मुझे xargsमैनुअल से संबंधित कुछ भी नहीं मिल रहा है । मुझे कुछ इस तरह चाहिए:

find . -iname "*.mov" -printf "%p %f\n" | xargs ffmpeg -i {param1} -f flv {param2}

मैं यह कैसे कर सकता हूँ?


आप में से वे लोग इस सवाल से लड़ रहे हैं, क्योंकि आप xargs सामान्य रूप से कई तर्कों के बारे में एक उत्तर की तलाश कर रहे हैं, जिन्हें आप stackoverflow.com/questions/3770432/… से देख सकते हैं ।
क्रिस ओल्डवुड

जवाबों:


4

कुछ इस तरह चाल करते हैं और पूरा पथ, संभाल अंतरिक्ष, नाम बदलने सुरक्षित करेगा folder/movie.movकरने के लिए folder/movie.flv, आदि

find . -name "*.mov" | while read movie;do
  ffmpeg -i "$movie" -f flv "${movie%.mov}.flv"
done

और अगर मैंने आपको गलत समझा और आप मौजूदा निर्देशिका में सभी .flv फिल्में चाहते हैं, तो इसके बजाय इसका उपयोग करें:

find . -name "*.mov" | while read movie;do
  ffmpeg -i "$movie" -f flv "$(basename "${movie%.mov}.flv")"
done

3
यदि आप इसे एक oneliner के रूप में चाहते हैं, तो बस सब कुछ एक लाइन पर रखें। ;)
मटियास अहेनबर्ग 2

9

लोगों xargsको खोजने के साथ संयोजन में उपयोग करने का कारण यह है कि जो भी प्रोग्राम xargsलॉन्च करता है , उसी प्रोग्राम के कई फ़ाइल नामों को पास किया जाएगा । उदाहरण के लिए, यदि findफ़ाइल foo , बार और बाज लौटाता है , तो निम्नलिखित mvकेवल एक बार चलेगा :

find sourceDir [...] -print0 | xargs -0 mv -t destDir

प्रभावी रूप से, यह mvनिम्नलिखित की तरह कहता है :

mv -t destDir foo bar baz

आप की जरूरत नहीं है या इस व्यवहार चाहते हैं (जैसा कि मुझे लगता है यहाँ मामला है), तो आप बस का उपयोग कर सकते findहै -exec


इस मामले में, एक आसान समाधान निम्नलिखित की तरह एक छोटी शेल स्क्रिप्ट लिखना होगा:

#!/usr/bin/env bash
[[ -f "$1" ]] || { echo "$1 not found" ; exit 1 ; }
P="$1"
F="$( basename $P )"
ffmpeg -i "$P" -f flv "$F"

के रूप में सहेजें myffmpeg.shऔर चलाएँ chmod +x myffmpeg.sh। फिर, निम्नलिखित चलाएँ:

find . -iname "*.mov" -exec /path/to/myffmpeg.sh {} \;

यह मिली हुई प्रत्येक फ़ाइल के लिए एक बार शेल स्क्रिप्ट का आह्वान करेगा। बदले में शेल स्क्रिप्ट फ़ाइल पथ को पूर्ण पथ से निकालती है, और ffmpegउपयुक्त तर्कों के साथ कॉल करती है।


4

मुझे वह समाधान नहीं मिला जिसकी मुझे उम्मीद थी, इसलिए मुझे अपना पता चला। @ डैनियल का जवाब अच्छा है, लेकिन इसके लिए एक शेल स्क्रिप्ट की जरूरत है। एक लाइनर जल्दी होता है, और मुझे यह बेहतर लगता है :) स्क्रिप्ट लिखने की तुलना में सरल समाधान भी।

मैं एक तर्क का उपयोग कर सकता हूं और इसके साथ basenameऔर प्रयोग कर सकता हूंsh -c

find . -iname "*.mov" -print0 | xargs -0 -i sh -c 'ffmpeg -i {} -f flv `basename {}`'

The-xargs को {}वर्तमान तर्क के साथ बदलने के लिए कहता है ।
कमांड आउटपुट के अंदर `` स्टैण्डर्ड आउटपुट (बैश फीचर) के लिए प्रिंट किया गया है, इसलिए basename {}इसका मूल्यांकन नंगे फ़ाइल नाम और प्रिंट आउट के रूप में किया जाएगा।
-0 विशेष फ़ाइल नामों को ठीक से संभालने के लिए, लेकिन आपको खोज के साथ -00 विकल्प के साथ मापदंडों को पारित करने की आवश्यकता है


3

आपको इसे वहाँ के सभी उत्तरों की तरह करना होगा, लेकिन xargs का सटीक उपयोग कुछ इस तरह होगा:

echo argument1 argument2 argument3 | xargs -l bash -c 'echo this is first:$0 second:$1 third:$2' | xargs

तो आपके मामले में यह होगा:

find . -iname "*.mov" -printf "%p %f\n" | xargs -l bash -c 'echo ffmpeg -i $0 -f flv $1' | xargs

PS: यह उन लोगों के लिए xargs के बारे में प्रश्न का उत्तर देता है जो xargsएक xargsकमांड में कई मापदंडों के लिए एक उत्तर की तलाश में हैं ।


1

केवल खोज आदेश से परिणामों के प्रारूप को फिट करने के लिए ffmpeg के विकल्प को क्यों नहीं स्थानांतरित किया जाए ?

find . -iname "*.mov" -printf "%p %f\n" | xargs -r -n2 ffmpeg -f flv -i

यदि कोई .mov फ़ाइलें नहीं मिली हैं, तो इसे ffmpeg को चलाने से रोकने के लिए xrgs के -r विकल्प के अलावा नोटिस करें ।

मैं जोड़ लिया है -n2 करने का विकल्प xargs के आइटम संख्या को सीमित करने xargs एक समय में दो करने के लिए प्रक्रियाओं। इस स्थिति में, आइटम फ़ाइल पथ और फ़ाइल नाम हैं। कोई तो -n विकल्प सेट किया गया है, xargs एक भी निष्पादन में संभव के रूप में कई इनपुट आइटम के रूप में कार्रवाई करेंगे।


एक से अधिक फ़ाइल AFAICT पाए जाने के बाद यह काम नहीं करेगा।
डैनियल बेक

यह मेरे लिए भी केवल एक बार काम करता है, लेकिन मुझे समझ में नहीं आता है कि यह पहले के बाद क्यों बंद हो जाता है। कोई उपाय ?
kissgyorgy

वास्तव में यह does not काम
kissgyorgy

एकल निष्पादन के बारे में डैनियल-बेक और @Walkman सही थे। उस समस्या को हल करने के लिए, मैंने इस उत्तर को -n2 विकल्प के माध्यम से xargs प्रक्रियाओं की संख्या को एक समय में सीमित करने के लिए संपादित किया है। -N2 के बिना , xargs केवल एक बार निष्पादित होता है यदि यह पाइप के माध्यम से प्राप्त इनपुट आइटम की संख्या को संभाल सकता है। यह भी बताया जाना चाहिए कि यह समाधान केवल तब काम करता है जब फ़ाइल नाम और फ़ाइल पथ में व्हॉट्सएप शामिल नहीं है।
ज़ॉर्टर

1

मुझे यकीन नहीं है कि अगर आप xargs के साथ ऐसा कर सकते हैं या कैसे कर सकते हैं।

लेकिन ऐसा कुछ आपके लिए काम करना चाहिए:

find . -iname "*.mov" -printf "%p %f\n" | while read -a HR ; do echo ffmpeg -i ${HR[0]} -f flv ${HR[1]} ;done

1
यह फ़ाइल नामों / रास्तों में रिक्त स्थान को ठीक से संभाल नहीं करता है, क्या यह करता है?
डैनियल बेक

1

नाम बाइंडिंग का उपयोग करते हुए (फाइल नामों में रिक्त स्थान के मुद्दे से बचने के लिए अलग विभाजक का उपयोग करते हुए) Zoredache के उत्तर के लिए एक विकल्प:

IFS="\t" find -iname "*.mov" -printf "%p\t%f\n" | while read path file; do
    ffmpeg -i $path -f flv $file
done

बेशक आप विभाजकों का उपयोग इस find -a arrayतर्क के साथ कर सकते हैं कि दूसरे उत्तर का उपयोग किया गया था, लेकिन कभी-कभी नामित तर्क अधिक व्यापक होते हैं।


0

आप ffmpeg को सीधे इस तरह पा सकते हैं:

find . -iname "*.mov" -exec ffmpeg -i "%p" -f flv "%f" \;

पैरामीटर के आसपास उद्धरणों पर ध्यान दें ffmpeg, अगर फ़ाइल नाम में रिक्त स्थान हैं, और बच गए अर्ध-बृहदान्त्र निष्पादित कमांड के अंत को चिह्नित करते हैं।


क्या आपके पास -exec के व्यवहार के लिए दस्तावेज़ीकरण है जो प्रिंटफ़ फॉर्मेटिंग प्लेसहोल्डर्स की व्याख्या करता है?
डैनियल बेक

नहीं। ब्रेन फार्ट: मैं सोच रहा था कि% p और% f खोज-चीजें थीं, प्रिंटफ-चीजें नहीं। मैंने आपके उत्तर के लिए मतदान किया है।
रैंडी ऑरेसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.