অনেকগুলি ফাইলে একটি কমান্ড চালানো


19

আমি অনেকগুলি ফাইলের সাথে একটি ফোল্ডার পেয়েছি (xyz1, xyz2, xyz5025 পর্যন্ত সমস্ত উপায়) এবং আমার প্রত্যেকটির উপর একটি স্ক্রিপ্ট চালানো দরকার, xyz1.faa, xyz2.faa, এবং আউটপুট হিসাবে।

একটি একক ফাইলের কমান্ডটি হ'ল:

./transeq xyz1 xyz1.faa -table 11

স্বয়ংক্রিয়ভাবে এটি করার কোন উপায় আছে? সম্ভবত একটি কাজ কম্বো?

উত্তর:


32
for file in xyz*
do
  ./transeq "$file" "${file}.faa" -table 11
done

এটি একটি সরল forলুপ যা xyzবর্তমান ডিরেক্টরিতে শুরু হওয়া প্রতিটি ফাইলের উপরে পুনরাবৃত্তি করবে এবং ./transeqপ্রোগ্রামটিকে প্রথম আর্গুমেন্ট হিসাবে ফাইলের নাম দিয়ে কল করবে , "-fa" দ্বারা দ্বিতীয় আর্গুমেন্ট হিসাবে অনুসরণ করবে, তারপরে "-table 11" অনুসরণ করবে ।


4
অথবা, একটি এক-লাইনের হিসাবে: for file in xyz*; do ./transeq "$file" "${file}.faa" -table 11; done। আমি এই ধরণের জিনিসটি সর্বদা টাইপ করি। এবং যদি আপনি যাচাই করতে চান যে ফাইলের নাম ইত্যাদি আপনি যেভাবে চান তার প্রসারিত হচ্ছে, প্রথমবারের echoপরে একটি ডান রাখুন doএবং তারপরে আপনার শেল ইতিহাসে ফিরে যান এবং দ্বিতীয়বার এটি মুছুন।
ডেভ টুইট করেছেন

"$file".faaইন্টারেক্টিভ ওয়ান-লাইনারের অংশ হিসাবে টাইপ করা কিছুটা সহজ, এবং নিরাপদ কারণ .faaকোনও শেল মেটাচার্যাক্টর নেই যা উদ্ধৃত করা দরকার।
পিটার

2
একটি নোট হিসাবে, আপনি যদি একটি আংশিক রান শেষ করেন এবং লুপটি পুনরায় চালু করতে চান xyz*তবে গ্লোব .fa ফাইলগুলিও বেছে নিতে পারে। ব্যাশের জন্য, চালান shopt -s extglob( রেফারেন্স ), তারপরে for file in xyz!(*.faa) ....fa ফাইলগুলি লুপের মাধ্যমে প্রেরণ করা থেকে বাদ দিতে ব্যবহার করুন ।
জেফ শ্যাচলার

24

আপনি যদি জিএনইউ সমান্তরাল ইনস্টল করেন তবে আপনি এটি সমান্তরালভাবে এটি করতে পারেন:

parallel ./transeq {} {}.faa -table 11 ::: xyz*

আপনি প্রোগ্রামটি যদি সিপিইউ নিবিড় হয় তবে এটি বেশ খানিকটা গতি বাড়ানো উচিত।


6

আপনি bashকমান্ড লাইনে এরকম কিছু করতে পারেন :

printf '%s\n' {1..5025} | xargs -l -I {} -t ./transeq xyz{} xyz{}.faa -table 11

আমরা 1 থেকে 5025, এক / লাইন পর্যন্ত পূর্ণসংখ্যা উত্পন্ন করছি, তারপরে একে {}একে একে একে জার্গাগুলিতে খাওয়াই যা সঠিক সংকেতটিকে পূর্ণ সংখ্যায় অন্তর্ভুক্ত করে এবং তারপর এটি একটি সঠিক পদ্ধতিতে ./transeq কমান্ড লাইনে প্রতিস্থাপন করে।

আপনার যদি ব্রেস-প্রসারণের সুবিধা না থাকে {n..m}তবে আপনি seqসেই সংখ্যাগুলি উত্পন্ন করতে ইউটিলিটিটি করতে চাইতে পারেন।

অথবা, আপনি সর্বদা এর মাধ্যমে সংখ্যার প্রজন্মকে অনুকরণ করতে পারেন:

yes | sed -n =\;5025q | xargs ...

1
ওভাবে জটিল। for i in {1..5025}; do ./transeq "xyz$i" "xyz$i".faa -table 11; doneচিন্তা এবং টাইপ করার উপায় সহজ। আপনি যদি আদেশগুলি কার্যকর করার আগে এটি মুদ্রণ করতে চান তবে ব্যবহার করুন set -x
পিটার

হ্যাঁ এটি সঠিক, তবে ওপি যেভাবে প্রশ্নটি প্রণয়ন করেছিল তা আমার কাছে মনে হয়েছিল যে কেবলমাত্র xyz1 .. xyz5025 নামের ফাইলগুলি আগ্রহী। সুতরাং আমি ভেবেছিলাম আমরা যদি এটি xyz * এর জন্য ব্যবহার করি তবে আমাদের অ-সঙ্গতিপূর্ণ ফাইলগুলি প্রত্যাখ্যান করার একটি উপায় প্রয়োজন ... সুতরাং এটি। আদর্শভাবে যদি ওপি কোনও ডিরেক্টরিতে পরিচালিত ডিরেক্টরিগুলির সমস্ত ফাইল চায়, তবে কেন এটি 1 থেকে 5025 জিনিস নিয়ে আসবে? কেবল বলুন যে আমি চাই যে একটি ফাইল নির্ধারিত পদ্ধতিতে প্রক্রিয়া করা যথেষ্ট ছিল।

1
আমি লিখেছি লুপ দেখুন। এটি ব্যবহার করে for i in {1..5025}অর্জন করা ঠিক পুলিশের হিসাবে একই ফলাফল। আপনি for ((i=1 ; i<=5025 ; i++)); do ./transeq "xyz$i" "xyz$i".faa -table 11; doneবাশেও লিখতে পারেন, তবে আমি সাধারণত {a..b}রেঞ্জের সিনট্যাক্সটি ব্যবহার করি কারণ এটি টাইপ করা দ্রুত faster
পিটার কর্ডেস

4

আপনার ফাইলগুলি ডিরেক্টরিগুলির ভিতরে ছড়িয়ে ছিটিয়ে থাকলে কার্যকর, দরকারী

find -name "xyz*" -exec ./transeq {} {}.faa -table 11 \;

4

ধরে নিচ্ছি আপনার একাধিক কোর রয়েছে এবং প্রতিটি আহবান বাকী অংশ থেকে স্বতন্ত্রভাবে চলতে পারে, আপনি সমান্তরাল রান নিয়ে বেশ দ্রুত গতি অর্জন করবেন।

এটি করার একটি অপেক্ষাকৃত সহজ উপায় হল -Pপ্যারামিটারের মাধ্যমে xargs- উদাহরণস্বরূপ, যদি আপনার কাছে 4 টি কোর থাকে:

echo xyz{1..5025} | \
    xargs -n 1 -P 4 -I{} /path/to/transeq xyz{} xyz{}.faa -table 11

-n 1বলে xargsপ্রতিটি আবাহন তালিকায় মাত্র একটি আর্গুমেন্ট বাছাই (ডিফল্ট দ্বারা এটি প্রচুর পাস হবে) , এবং -P 4বলা হয়েছে যে সব একই সময়ে 4 টি প্রক্রিয়ার জন্ম দিয়েছেন - যখন এক মরে, একটি নতুন এক উত্পন্ন হওয়া হয়।

আইএমএইচও, এই সাধারণ ক্ষেত্রে - আপনার xargsযথেষ্ট পরিমাণের জন্য আপনাকে জিএনইউ সমান্তরাল ইনস্টল করার দরকার নেই ।


0

তুমি ব্যবহার করতে পার xarg

ls | xargs -L 1 -d '\n' your-desired-command

-L 1 একসাথে 1 আইটেম পাস করে

-d '\n'মেক আউটপুট lsনতুন লাইনের উপর ভিত্তি করে বিভক্ত হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.