উত্তর:
একটি ভাল সমাধান (শুধুমাত্র ব্যাশ বৈশিষ্ট্য সহ, যেমন বাহ্যিক কল থেকে ভিন্ন) জন্য, দেখুন অন্যান্য উত্তর এক ।
নিম্নলিখিতগুলি renameপ্রোগ্রামটি করার জন্য সিস্টেমটির প্রয়োজন এবং এটির প্রয়োজন নেই (যদিও আপনি প্রায়শই একটি সিস্টেমে এটি ব্যবহার করবেন):
for file in *.html; do
mv "$file" "$(basename "$file" .html).txt"
done
সম্পাদনা: মন্তব্যে নির্দেশিত হিসাবে, ফাইলের নামগুলি ফাঁকা জায়গাগুলির সাথে যথাযথ উদ্ধৃতি না দিয়ে (এখন উপরে যোগ করা হয়েছে) কাজ করে না। আপনার নিজের ফাইলগুলিতে খাঁটিভাবে কাজ করার সময় আপনি জানেন যে ফাইলনামে ফাঁকা স্থান নেই এটি কাজ করবে তবে যখনই আপনি এমন কিছু লিখবেন যা পরবর্তী সময়ে পুনরায় ব্যবহার করা যেতে পারে তখন সঠিক উদ্ধৃতিটি এড়িয়ে যাবেন না।
ren *.a *.b
$()উত্তরাধিকার ব্যাকটিক সিনট্যাক্সের পরিবর্তে POSIX- নির্দিষ্ট ব্যবহার করুন। পাঠযোগ্যতা উন্নত করে এবং বাক্যবিন্যাসকে অনেক কম দ্বিধাগ্রস্থ করে তোলে যখন আপনার এমন অক্ষর থাকে যা পরবর্তীগুলির সাথে কমান্ড প্রতিস্থাপনের অভ্যন্তরে আক্ষরিক হয়ে উঠতে ব্যাকস্ল্যাশ-পলায়ন হওয়া দরকার।
যদি ব্যাশ ব্যবহার করা হয় তবে সেড, বেসনাম, পুনঃনামকরণ, এক্সপ্রেস ইত্যাদির মতো বাহ্যিক কমান্ডের প্রয়োজন নেই
for file in *.html
do
mv "$file" "${file%.html}.txt"
done
"${file%.*}.txt"তবে ফাইলের জন্য এটি বিপজ্জনক হতে পারে ডাব্লু / ও মোটেও একটি এক্সটেনশান।
$কোঁকড়া ধনুর্বন্ধনীগুলির ভিতরে কোনও নেই !
--"অপারেটর": এমভি - "$ ফাইল" "" $ {ফাইল% .html} .txt " ব্যবহার করেও সেই অপারেটর ফাইলগুলির নামগুলি শুরু করে যা শুরু হয় একটি '-' যুক্তি হিসাবে এমভি দ্বারা বিভক্ত হওয়া থেকে।
rename 's/\.html$/\.txt/' *.html
আপনি যা চান ঠিক তাই করে
এটি OSX এ আমার কাছে .txt থেকে .txt_bak এ কাজ করেছে
find . -name '*.txt' -exec sh -c 'mv "$0" "${0%.txt}.txt_bak"' {} \;
.txtযেতে .txt_bakহবে কেবল _bak
.scssকরে .sass( স্থানান্তরিত হওয়ার পরে…):find . -name '*.scss' -exec sh -c 'mv "$0" "${0%.scss}.sass"' {} \;
আপনি ব্যবহার করতে চান rename:
rename -S .html .txt *.html
এটি ঠিক আছে আপনি যা চান তা - এটি থেকে এক্সটেনশন পরিবর্তন করতে হবে .htmlকরতে .txtসব ম্যাচিং ফাইলের জন্য *.html।
দ্রষ্টব্য: গ্রেগ হিউগিল সঠিকভাবে উল্লেখ করেছেন এটি কোনও ব্যাশ বিল্টিন নয়; এটি একটি পৃথক লিনাক্স কমান্ড। আপনার যদি লিনাক্সের কিছু প্রয়োজন হয় তবে এটি ঠিকঠাক কাজ করা উচিত; আপনার যদি আরও কিছু ক্রস প্ল্যাটফর্মের প্রয়োজন হয় তবে অন্য উত্তরগুলির মধ্যে একটিতে একবার দেখুন।
renameপ্রোগ্রামটি সম্পর্কিত নয় bashএবং এটি সমস্ত প্ল্যাটফর্মেও উপলভ্য নয়। আমি এটি কেবল লিনাক্সে দেখেছি।
rename -S .html .text *.htmlযেখানে -Sদাঁড়িয়ে আছে--subst-all
একটি ম্যাক ...
brew install renamerename -S .html .txt *.htmlউবুন্টু ব্যবহারকারীদের জন্য:
rename 's/\.html$/\.txt/' *.html
পুনর্নবীকরণ কমান্ডের একটি উদাহরণ এখানে দেওয়া হয়েছে:
rename -n ’s/\.htm$/\.html/’ *.htm
-N এর অর্থ হল এটি একটি পরীক্ষা চালানো এবং আসলে কোনও ফাইল পরিবর্তন করবে না। এটি আপনাকে ফাইলগুলির একটি তালিকা প্রদর্শন করবে যা আপনি -n সরিয়ে ফেললে পুনরায় নামকরণ করা হবে। উপরের ক্ষেত্রে এটি বর্তমান ডিরেক্টরিতে থাকা সমস্ত ফাইলকে .htm এর ফাইল এক্সটেনশন থেকে .html রূপান্তর করবে।
উপরের পরীক্ষার রানটির আউটপুট যদি ঠিকঠাক মনে হয় তবে আপনি চূড়ান্ত সংস্করণটি চালাতে পারেন:
rename -v ’s/\.htm$/\.html/’ *.htm
-V alচ্ছিক, তবে এটি অন্তর্ভুক্ত করা ভাল ধারণা কারণ নীচের নমুনা আউটপুটে প্রদর্শিত নামটি পুনর্নির্বাচিত কমান্ড দ্বারা পরিবর্তন করা হয়েছে এটির একমাত্র রেকর্ড আপনার রয়েছে:
$ rename -v 's/\.htm$/\.html/' *.htm
3.htm renamed as 3.html
4.htm renamed as 4.html
5.htm renamed as 5.html
মাঝের জটিল অংশটি নিয়মিত প্রকাশের সাথে পার্ল প্রতিস্থাপন যা নীচে হাইলাইট করা হয়েছে:
rename -v ’s/\.htm$/\.html/’ *.htm
এই প্রশ্নে স্পষ্টভাবে বাশকে উল্লেখ করা হয়েছে, তবে যদি আপনার কাছে জেডএসএইচ উপলব্ধ থাকে তবে এটি বেশ সহজ:
zmv '(*).*' '$1.txt'
যদি আপনি পান zsh: command not found: zmvতবে কেবল চালান:
autoload -U zmv
এবং তারপরে আবার চেষ্টা করুন।
Zmv সম্পর্কে টিপ জন্য এই মূল নিবন্ধ ধন্যবাদ ।
অন্য কারও ওয়েবসাইট ক্রল হওয়ার পরে, আমি উপ-ডিরেক্টরিগুলির বিস্তৃত বৃক্ষ জুড়ে হাজার হাজার ফাইলকে .html এক্সটেনশানটি হারিয়েছি।
ইতিমধ্যে একটি এইচটিএমএল এক্সটেনশন থাকা ফাইলগুলি (তাদের বেশিরভাগের কিছুই ছিল না) ব্যতীত সমস্তগুলিকে একটি শটে নামকরণ করতে, এটি আমার পক্ষে কাজ করেছে:
cd wwwroot
find . -xtype f \! -iname *.html -exec mv -iv "{}" "{}.html" \; # batch rename files to append .html suffix IF MISSING
অপির ক্ষেত্রে আমি কেবলমাত্র * .txt ফাইলের নাম পরিবর্তন করতে, এটিকে কিছুটা সংশোধন করতে পারি:
find . -xtype f -iname *.txt -exec filename="{}" mv -iv ${filename%.*}.{txt,html} \;
ভেঙে পড়েছে (হাতুড়ি!):
-নাম * .txt
- এর অর্থ কেবলমাত্র ইতিমধ্যে শেষ হওয়া ফাইলগুলি বিবেচনা করে
এমভি -iv "{} {TXT, HTML}।" - যখন খোঁজ পাসের {} ফাইলের নাম হিসাবে একটি $ {। ফাইলের নাম% *} তার basename যেকোনো এক্সটেনশন ছাড়াই পরামিতি গঠনের চায়ের এমভি । বাশ এটিকে দুটি পরামিতি হিসাবে পুনরায় লেখতে {txt, html takes নেয় যাতে চূড়ান্ত কমান্ডটি এইভাবে চালিত হয়:mv -iv "filename.txt" "filename.html"
যদিও প্রয়োজন ঠিক করুন: ফাইলের নামগুলিতে ফাঁক দিয়ে কাজ করে
কমান্ডmmv (ক দ্বিতীয় অযুত) ফাইল একটি বিশাল সংখ্যার উপর খুব দক্ষতার সঙ্গে এই কাজের না বলে মনে হয়। উদাহরণস্বরূপ, সমস্ত .xmlফাইলের ফাইলের নাম পরিবর্তন .htmlকরতে, এটি ব্যবহার করুন:
mmv ";*.xml" "#1#2.html"
;পথ ম্যাচ হবে, *ফাইলের নাম ম্যাচ হবে, এবং এই হিসেবে উল্লেখ করা হয় #1এবং #2প্রতিস্থাপন নামে।
উপর ভিত্তি করে উত্তর execপাইপগুলির বা পাইপগুলির খুব ধীরে ধীরে বা খুব বড় সংখ্যক ফাইলে ব্যর্থ হয়েছিল।
পার্টিতে কিছুটা দেরি। আপনি এটি xargs দিয়ে করতে পারেন:
ls *.html | xargs -I {} sh -c 'mv $1 `basename $1 .html`.txt' - {}
অথবা যদি আপনার সমস্ত ফাইল কোনও ফোল্ডারে থাকে
ls folder/*.html | xargs -I {} sh -c 'mv $1 folder/`basename $1 .html`.txt' - {}
ls । এই কমান্ডটি হাস্যকর: এটি lsসরাসরি গ্লোব ব্যবহারের পরিবর্তে অকার্যকরভাবে একটি গ্লোব ব্যবহার করে। এটি ফাঁকা স্থান, উক্তি এবং (কোটের অভাবের কারণে) গ্লোব অক্ষরগুলি সহ ফাইলের নামগুলি ভেঙে দেবে।
আপনি যদি পিইআরএল পছন্দ করেন তবে একটি সংক্ষিপ্ত পার্ল স্ক্রিপ্ট রয়েছে (মূলত লেরি ওয়াল লিখেছেন, পিইআরএল এর স্রষ্টা) যা আপনি এখানে যা চান ঠিক তা করবে: টিপস.ওয়েবডিজাইন 10.com/files/rename.pl.txt ।
আপনার উদাহরণের জন্য নিম্নলিখিত কৌশলগুলি করা উচিত:
rename.pl 's/html/txt/' *.html
একটি লাইন, লুপ নেই:
ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
উদাহরণ:
$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.json ac8453e2-0d82-4d43-b80e-205edb754700.json
$ ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.txt ac8453e2-0d82-4d43-b80e-205edb754700.txt
দুর্ভাগ্যক্রমে এটি বহনযোগ্যভাবে করা তুচ্ছ নয়। আপনার সম্ভবত কিছুটা এক্সপ্রেস ম্যাজিক দরকার।
for file in *.html; do echo mv -- "$file" "$(expr "$file" : '\(.*\)\.html').txt"; done
আপনি যখন খুশি হন তখন প্রতিধ্বনিটি সরান।
সম্পাদনা: basename এই বিশেষ ক্ষেত্রে সম্ভবত কিছুটা বেশি পাঠযোগ্য, যদিও exprসাধারণভাবে এটি আরও নমনীয়।
এখানে .edgeফাইলগুলির নাম পরিবর্তন করার জন্য আমি কী ব্যবহার করেছি.blade.php
for file in *.edge; do mv "$file" "$(basename "$file" .edge).blade.php"; done
মোহন মত কাজ করে।
আপনি বাশে কোনও ফাংশনও তৈরি করতে পারেন, এটিতে .bashrcবা কোনও কিছুতে যুক্ত করতে পারেন এবং তারপরে আপনি যেখানে চান সেখানে এটি ব্যবহার করতে পারেন।
change-ext() {
for file in *.$1; do mv "$file" "$(basename "$file" .$1).$2"; done
}
ব্যবহার:
change-ext css scss
কার্যক্রমে কোডের উত্স: https://stackoverflow.com/a/1224786/6732111
বর্তমান ডিরেক্টরি এবং সাব ডিরেক্টরি ডিরেক্টরিতে অন্য কোনও প্যাকেজ ছাড়াই সমস্ত ফাইলের জন্য ফাইল এক্সটেনশনের নাম পরিবর্তন করুন (কেবল শেল স্ক্রিপ্ট ব্যবহার করুন):
rename.shনিম্নলিখিত ডিরেক্টরি সহ বর্তমান ডিরেক্টরিতে শেল স্ক্রিপ্ট তৈরি করুন :
#!/bin/bash
for file in $(find . -name "*$1"); do
mv "$file" "${file%$1}$2"
doneএটি দিয়ে চালান ./rename.sh .old .new।
যেমন। ./rename.sh .html .txt