এক কমান্ডের সাহায্যে একটি গ্রুপের ফাইলের নাম পরিবর্তন করুন


38

আমার কাছে যদি .htm এক্সটেনশন সহ একটি গ্রুপের ফাইল থাকে তবে আমি কীভাবে সেগুলি সবগুলি .html এ নামকরণ করতে পারি?

mv *.htm *.html

কাজ করে না.


শুধুমাত্র সম্পূর্ণতার স্বার্থে, ren *.htm *.htmlউইন্ডোজটিতে কাজ করবে।
ব্রায়ান বার্নস

উত্তর:


50

অথবা, আপনি খাঁটি বাশ ব্যবহার করতে পারেন ... (এমভি ব্যতীত, এটি হল ..)

for file in *.htm; do mv "$file" "${file%.htm}.html"; done

এবং বাজে বেসমেন্ট স্টাফ এড়ানো। ;)

ব্যাশের পরিবর্তনশীল সম্প্রসারণ বিকল্পগুলির একটি বিস্তৃত সেট রয়েছে। এখানে ব্যবহৃত একটি '%' ভেরিয়েবলের মান থেকে ক্ষুদ্রতম মিলের প্রত্যয়টিকে সরিয়ে দেয়। প্যাটার্নটি গ্লোব প্যাটার্ন, তাই ${file%.*}এটিও কাজ করবে। '%%' অপারেটর সর্বাধিক মিলে যাওয়া প্রত্যয়টি সরিয়ে দেয় এবং উপরের উদাহরণে ${file%%.*}.htmlআদান-প্রদানযোগ্য , যেমন প্যাটার্নটি স্থির করা হয়েছে, যদিও এটি abhtm এএইচটিএমএলে পরিণত হবে।

আরও ঝরঝরে কৌশলগুলির জন্য ব্যাশ ম্যানপেজের পরিবর্তনশীল বিকল্প বিভাগটি দেখুন See সরাসরি বাশের মধ্যেও অনেক কিছু করা যায়।


1
আরও মনে রাখবেন যে এই প্যারামিটারের বিস্তৃতি কেবল ব্যাশের মধ্যে সীমাবদ্ধ নয় । এগুলি সমস্ত বোর্ন-উত্পাদিত শেলগুলিতে উপলব্ধ রয়েছে ( sh , ksh , bash , zsh , dash , ash , ইত্যাদি)। সম্প্রসারণগুলি "শেল কমান্ড ল্যাঙ্গুয়েজ" এর জন্য পসিক্স স্পেসিফিকেশনের একটি অংশ এবং অত্যন্ত পোর্টেবল।
ক্রিস জনসেন

11

ফাইলের নামগুলিতে ফাঁকা স্থান, নিউলাইনগুলি বা অন্যান্য সাদা স্থান থাকা উচিত নয়, তবে ফ্রেইহাইটের উত্তরের এই সংস্করণগুলি সেগুলি পরিচালনা করে। এটি $()অন্যান্য সুবিধাগুলির পাশাপাশি পাঠযোগ্যতার জন্য ব্যাকটিকগুলির পরিবর্তে ব্যবহার করে।

for file in *.htm
do
    mv "$file" "$(basename "$file" .htm).html"
done

আরও ভাল - কেবল শেষ করার জন্য বিশেষ ক্ষেত্রেটির জন্য:

for file in *.htm
do
    mv "$file" "${file}l"
done

11

rename(1)পার্ল ইউটিলিটি যা আপনি যা চান ঠিক তেমন করে। এক্ষেত্রে:

rename 's/\.htm$/.html/' *htm

অথবা আপনি যদি উপ ডিরেক্টরি ব্যবহার করেন তবে

(বাশ 4.0 এবং গ্লোবস্টার সেটিং প্রয়োজন shopt -s globstar:)

rename 's/\.htm$/.html/' **/*htm


1
পুনরায় নামকরণ করা সহজ তবে এটি একটি আদর্শ ইউনিক্স প্রোগ্রাম নয়; মূল প্রশ্নটি কোন ইউনিক্সটি নির্দিষ্ট করে না। কিছু জায়গায় "নাম" বলে মনে হচ্ছে।
ফ্রেইহিট

2
renameপার্ল নিয়ে আসে এবং মূলত প্রতিটি ইউনিক্স এই দিনগুলিতে পার্ল নিয়ে আসে।
টিআরএস -80

3
হ্যাঁ, তবে প্রতিটি ইউনিক্স সিস্টেমে পার্ল রাখলে 'পুনর্নামকরণ' এর মতো আনুষঙ্গিক প্রোগ্রাম অন্তর্ভুক্ত করে না। উদাহরণস্বরূপ, ওএসএক্সটির "নাম পরিবর্তন" নেই have
ফ্রেইহিট

1
@ উইলিয়াম: ডাবল অ্যারাস্টিক সিনট্যাক্স কেবলমাত্র ব্যাশ 4 এবং তারপরে পাওয়া যায় এবং এটি চালু থাকলেই shopt -s globstar(ডিফল্টরূপে বন্ধ থাকে)। এছাড়াও, ফোল্ডারগুলির চেয়ে লিনাক্স এবং ইউনিক্সের ডিরেক্টরি রয়েছে।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

6
for file in *.htm; do
  mv $file `basename "$file" .htm`.html
done

একটি সঙ্গে এটি ব্যবহার করে দেখুন echoসামনে mvপ্রথমবার প্রায়।

আপনার আসল সমস্যাটি হ'ল " mv *.htm *.html" *শেলটি পরিচালনা করে, সুতরাং mvকমান্ডটি কেবল বর্তমান ডিরেক্টরিতে সমস্ত .htm এবং .html ফাইলগুলির একটি তালিকা দেখতে পাবে। অন্য কথায়, " mv foo.htm bar.htm stuff.htm six.htm file.htm" এর মতো কিছু । এমভি কেবলমাত্র 2 টিরও বেশি আর্গুমেন্ট পরিচালনা করতে পারে যদি শেষের ডিরেক্টরি হয় a


1
স্পেসগুলি পরিচালনা করতে আপনার "$ ফাইল" উদ্ধৃতি করা উচিত।
রিচার্ড হোসকিন্স

আপনার আসল সমস্যার বর্ণনাটি আরও জোর দিয়ে জোর দেওয়া উচিত। এই শেল ওয়াইল্ডকার্ড সম্প্রসারণ আচরণটি উইন্ডোজ ল্যান্ড থেকে আগত কারও জন্য আশ্চর্যজনক এবং স্বজ্ঞাত নয় এবং শেলটি কী করে তা বোঝার ফলে এটি পরিষ্কার হয়ে যায় যে আসল প্রয়োগটি কেন mvকাজ করবে না।
গ্রেগ হিউগিল

3

তবুও অন্য খাঁটি বাশের উদাহরণ স্ট্রিং প্রতিস্থাপন ব্যবহার করে।

for file in *.htm; do mv $file ${file/htm/html}; done

অতিরিক্ত - এটি একটি স্ট্রিংয়ের সমস্ত উপস্থিতিকে প্রতিস্থাপন করে

for file in *.htm; do mv $file ${file//htm/html}; done


1

সেরা হাতিয়ারটি এমএমভি

mmv \*.htm #1.html

" জিএনইউ / লিনাক্স কমান্ড-লাইন সরঞ্জাম সংক্ষিপ্তসার " ব্যবহারের অন্যান্য উদাহরণ (এবং অন্যান্য সরঞ্জামের) ।


1
আপনার ব্যবহারের উদাহরণ ব্যর্থ। আপনি অব্যাহতি প্রয়োজন #
ক্রিশ্চিয়ান সিউপিতু

না, এটি কাজ করে (সুপার ইউজারে পোস্ট করার আগে আমি সবসময় পরীক্ষা)। # পলায়নের প্রয়োজনীয়তা আপনি যে শেলটি ব্যবহার করেন তার উপর নির্ভর করে (আমি zsh ব্যবহার করি)।
bortzmeyer

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