আমি একাধিক ফাইলে কমান্ড কিভাবে চালাব


13

এটি বেশ বেসিক, আমার জেএস ফাইলের বেশ কয়েকটি সাবফোল্ডার সহ একটি ফোল্ডার রয়েছে এবং আমি সেই ফোল্ডারগুলির সমস্ত ফাইলে গুগলের ক্লোজার সংকলকটি চালাতে চাই। একটি একক ফাইল প্রক্রিয়া করার কমান্ডটি নিম্নরূপ:

java -jar compiler.jar --js filename.js --js_output_file newfilename.js

আমার ডিরেক্টরি কাঠামোর প্রতিটি জেএস ফাইল চালানোর জন্য আমি কীভাবে এটি সংশোধন করব?

উত্তর:


14

আপনি ব্যবহার করতে পারেন find:

find . -name "*.js" -exec java -jar compiler.jar --js {} --js_output_file new{} \;

ধন্যবাদ, এবং আমি সম্ভবত সবকিছু পুনঃনামকরণের জন্য এটি
উপার্জন

--Js এবং --js_output_file পার্থক্য করার প্রয়োজন হলে আমি একটি দ্বি-লাইন স্ক্রিপ্ট তৈরি করব যা ফাইলের mvনামটিকে প্যারামিটার হিসাবে গ্রহণ করবে, অস্থায়ী ফাইলের আউটপুট লিখবে এবং ফাইলটি মূল নামটি লিখবে ।
অ্যান্থন

আপনি আলাদা স্ক্রিপ্ট তৈরি এড়াতে find -name '*.js' | while read jsfile; do java -jar compiler.jar --js "$jsfile" --js_output_file "new$jsfile" && mv "new$jsfile" "$jsfile"; doneচাইলে কৌশলটি করা উচিত।
ডেভিড ব্যাগারম্যান

find -execসাধারণ কমান্ডের জন্য দুর্দান্ত। জটিলগুলির জন্য find | xargsএটি আরও ভাল এবং এটি সমান্তরালভাবে কমান্ড চালানোর অনুমতি দেয়।
রাশ

@ রাশ সম্ভবত ব্যাখ্যা করুন কেন xargsভাল?
মেল বয়েস

7

আপনি একটি সাধারণ forলুপও ব্যবহার করতে পারেন , বিশেষত যদি ফাইলগুলি একটি ডিরেক্টরিতে থাকে (কোনও সাব-ডিরেক্টরি নেই)। এটি পাশাপাশি উপ-ডিরেক্টরিতেও কাজ করার জন্য পরিবর্তন করা যেতে পারে।

পুনরাবৃত্তি ছাড়াই:

for filename in ./*.js
do
    java -jar compiler.jar --js "${filename}" --js_output_file "new${filename}"
done

বা সমতুল্য ওয়ান-লাইনার হিসাবে:

for filename in ./*.js; do java -jar compiler.jar --js "${filename}" --js_output_file "new${filename}"; done

উপ-ডিরেক্টরিতে পুনরাবৃত্তি করতে (জিএনইউ বাশ 4.0 বা আরও নতুন প্রয়োজন) (ধন্যবাদ @ ক্রিসডাউন ):

shopt -s globstar
for filename in ./**/*.js; do
    java -jar compiler.jar --js "${filename}" --js_output_file "new${filename}"
done

1
এই প্রশ্নে জিজ্ঞাসা করা সাব ডাইরেক্টরিগুলি পুনরাবৃত্তি করে না। Bash4 + সহ, আপনি এটি করতে ব্যবহার globstarকরতে পারেন।
ক্রিস ডাউন

1
হ্যাঁ, এটি একটি ভাল উত্তর এবং জানা দুর্দান্ত, তবে অন্য উত্তরটি আমার যা প্রয়োজন তা ঠিক করে দেয়।
মতানিকো

1
ওহ, আমি "বেশ কয়েকটি সাবফোল্ডার" অংশ পুরোপুরি মিস করতে পেরেছি। দুঃখিত। যদিও সম্পূর্ণতার জন্য জবাব ছেড়ে দেওয়া।
একটি সিভিএন

3
@ রশ যেহেতু **পুনরাবৃত্তি একটি স্বেচ্ছাসেবী স্তরের সাথে মেলে নিতে পারে, **/*.jsকাজ করে: স্প্রঞ্জ.ইস
ক্রিস ডাউন

1
সাধারণভাবে ব্যবহার করার জন্য একটি ভাল ধারণা for f in ./*.js; doবা for f in ./**/*.js; doঅর্ডার নিজের একটি থেকে শুরু ফাইলের নামের থেকে রক্ষা করার জন্য -(আমি যে যদি এই ক্ষেত্রে প্রয়োজনীয় জানি না, কিন্তু এটি একটি ভাল অভ্যাস যাহাই হউক না কেন এর)।
অরিসুপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.