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 সাধারণভাবে একাধিক যুক্তি সম্পর্কে উত্তর সন্ধান করছেন তারা হয়ত স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 703770০৪32২ / দেখতে চান
ক্রিস ওল্ডউড

উত্তর:


4

এর মতো কিছু কৌশলটি করবে এবং পুরো পথটি সংরক্ষণ করবে, স্থান হ্যান্ডেল করবে, নাম পরিবর্তন folder/movie.movকরবে folder/movie.flvইত্যাদি will

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
আপনি যদি অনলাইনার হিসাবে এটি চান তবে কেবল সবকিছুকে একটি লাইনে রাখুন। ;)
ম্যাটিয়াস আহ্নবার্গ

9

লোকেরা xargsসন্ধানের সাথে সংমিশ্রণে যে কারণটি ব্যবহার করে তা হ'ল যে কোনও প্রোগ্রাম xargsচালু হওয়ায় একই প্রোগ্রামের অনুরোধে একাধিক ফাইলের নাম পাঠানো হবে । উদাহরণস্বরূপ, যদি foo , বার এবং বাজfind ফাইলগুলি ফেরত দেয় তবে নিম্নলিখিতগুলি একবারে চলবে :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 {}`'

-I {}বর্তমান যুক্তি দিয়ে প্রতিস্থাপন করতে xargs কে বলে to
Command inside এর ভিতরে কমান্ড আউটপুট প্রিন্ট আউট স্ট্যান্ডার্ড আউটপুট (ব্যাশ বৈশিষ্ট্য) তাই basename {}খালি ফাইলের নাম হিসাবে মূল্যায়ন করা হবে এবং মুদ্রিত আউট হবে।
বিশেষ ফাইলের নামগুলি সঠিকভাবে পরিচালনা করার জন্য -0, তবে আপনাকে খুঁজে-প্রিন্ট 0 বিকল্পের সাথে প্যারামিটারগুলি পাস করতে হবে


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

পিএস: এটি যারা xargsএক xargsআদেশে একাধিক পরামিতিগুলির জন্য সঠিক উত্তর খুঁজছেন তাদের xargs সম্পর্কে প্রশ্নের উত্তর দেয় ।


1

অনুসন্ধান কমান্ড থেকে ফলাফলের বিন্যাসের সাথে ফিট করার জন্য কেন কেবল ffmpeg বিকল্পগুলি সরানো হচ্ছে না ?

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

কোন .mov ফাইল পাওয়া না গেলে ffmpeg চালানো থেকে রোধ করার জন্য xargs- -r বিকল্পটি যুক্ত করার বিষয়টি লক্ষ্য করুন ।

আমি যোগ করেছি -n2 করার বিকল্প xargs আইটেম সংখ্যা সীমিত করতে xargs একটি সময়ে দুই প্রক্রিয়া। এই ক্ষেত্রে, আইটেমগুলি হ'ল ফাইলের পথ এবং ফাইলের নাম। যদি কোনও -n বিকল্প সেট না করা থাকে তবে xargs একটি একক এক্সিকিউশনে যতটা সম্ভব ইনপুট আইটেমগুলি প্রক্রিয়া করবে।


একাধিক ফাইল AFAICT পাওয়া গেলে এটি কাজ করবে না।
ড্যানিয়েল বেক

এটি আমার জন্য কেবল একবারে কাজ করে, তবে কেন এটি প্রথমটির পরে বন্ধ হয় তা আমি বুঝতে পারি না। কোন ধারণা ?
কিসিওর্জি

আসলে এটি কাজ করে না
21:25:25 এ কিসিওর্জি

ড্যানিয়েল-বেক এবং @ওয়ালকম্যান একক মৃত্যুদন্ড কার্যকর করার বিষয়ে সঠিক ছিলেন। এই সমস্যাটি সমাধান করার জন্য, আমি -n2 বিকল্পের মাধ্যমে একসাথে আইটেম xargs প্রক্রিয়া সীমাবদ্ধ করতে এই উত্তরটি সম্পাদনা করেছি । -N2 ছাড়া , xargs কেবল একবার কার্যকর করে যদি এটি পাইপের মাধ্যমে প্রাপ্ত ইনপুট আইটেমগুলির সংখ্যা পরিচালনা করতে পারে। এটিও উল্লেখ করা উচিত যে এই সমাধানটি কেবল তখনই কাজ করে যখন ফাইলের নাম এবং ফাইলের পাথগুলিতে সাদা স্থান অন্তর্ভুক্ত না হয়।
জায়েস্টার

1

আমি নিশ্চিত না যে আপনি কীভাবে বা জার্গার্স দিয়ে এটি করতে পারেন।

তবে এর মতো কিছু আপনার পক্ষে কাজ করা উচিত:

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

1
এটি ফাইলের নাম / পাথগুলিতে স্পেসগুলি সঠিকভাবে পরিচালনা করে না, তাই না?
ড্যানিয়েল বেক

1

নাম বেঁধে দেওয়া (এবং ফাইলের নামের ফাঁকির বিষয়টি এড়াতে বিভিন্ন বিভাজক ব্যবহার করে) জোড়াদেচের উত্তরের বিকল্প:

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 এর পরামিতিগুলির চারপাশের উদ্ধৃতিগুলি নোট করুন, যদি ফাইলনামে ফাঁকা স্থান থাকে এবং পালানো সেমি-কোলন সম্পাদিত কমান্ডের শেষে চিহ্নিত করে।


এক্সেক্সের আচরণের জন্য কী আপনার কাছে ডকুমেন্টেশন রয়েছে যা মুদ্রণ প্লেফোল্ডারগুলিও অনুবাদ করে?
ড্যানিয়েল বেক

নাঃ। ব্রেইন ফার্ট: আমি ভাবছিলাম যে% p এবং% f সন্ধানকারী জিনিস ছিল, প্রিন্টফ-জিনিসগুলি নয়। আমি আপনার উত্তরের জন্য ভোট দিয়েছি।
র্যান্ডি অরিসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.