গুচ্ছ ফাইলগুলির জন্য আমি কীভাবে এই এক্সটেনশনের নাম পরিবর্তন করব?


479

একটি ডিরেক্টরিতে আমার কাছে অনেকগুলি *.htmlফাইল রয়েছে। আমি তাদের সকলের নাম পরিবর্তন করতে চাই*.txt

আমি এটা কিভাবে করবো? আমি ব্যাশ শেল ব্যবহার করি

উত্তর:


382

একটি ভাল সমাধান (শুধুমাত্র ব্যাশ বৈশিষ্ট্য সহ, যেমন বাহ্যিক কল থেকে ভিন্ন) জন্য, দেখুন অন্যান্য উত্তর এক


নিম্নলিখিতগুলি renameপ্রোগ্রামটি করার জন্য সিস্টেমটির প্রয়োজন এবং এটির প্রয়োজন নেই (যদিও আপনি প্রায়শই একটি সিস্টেমে এটি ব্যবহার করবেন):

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

সম্পাদনা: মন্তব্যে নির্দেশিত হিসাবে, ফাইলের নামগুলি ফাঁকা জায়গাগুলির সাথে যথাযথ উদ্ধৃতি না দিয়ে (এখন উপরে যোগ করা হয়েছে) কাজ করে না। আপনার নিজের ফাইলগুলিতে খাঁটিভাবে কাজ করার সময় আপনি জানেন যে ফাইলনামে ফাঁকা স্থান নেই এটি কাজ করবে তবে যখনই আপনি এমন কিছু লিখবেন যা পরবর্তী সময়ে পুনরায় ব্যবহার করা যেতে পারে তখন সঠিক উদ্ধৃতিটি এড়িয়ে যাবেন না।


47
বেসনামহীন ও উদ্ধৃতি সহ একটি বিকল্প: এমভি "$ {ফাইল}" "$ {ফাইল /%। এইচটিএমএল / .txt}" (ম্যান বাশ, বিশদগুলির জন্য প্যারামিটার সম্প্রসারণ দেখুন)
রড্রিগো কুইরো

7
কেবলমাত্র ফাইলগুলি যদি বর্তমান ডিরেক্টরিটিতে থাকে তবে অবশ্যই ভাল, কারণ বেসনামটি পথের নাম অংশটি সরিয়ে দেয়। শুধু একজন 'সাবধান'!
জোনাথন লেফলার

6
এই সমাধানটি খারাপ, কেবল এটি ধীর হওয়ার কারণেই নয় কারণ এটিতে ফাঁকা ফাইল ফাইলের সাথে কাজ করে না। আপনার বাশ স্ক্রিপ্টগুলিতে যথাযথ উদ্ধৃতিটি সর্বদা করা উচিত। এমভি "$ ফাইল" "$ (বেসনাম" $ ফাইল "। এইচটিএমএল)"। txt আরও ভাল হবে। তবে এখনও, এমভি "$ ফাইলগুলি" "$। ফাইল% .html} .txt" আরও ভাল।
বালজ পোজসার

8
উইন্ডোতে আপনি কেবল করেনren *.a *.b
মুহাম্মদ উমার

2
সর্বনিম্ন, $()উত্তরাধিকার ব্যাকটিক সিনট্যাক্সের পরিবর্তে POSIX- নির্দিষ্ট ব্যবহার করুন। পাঠযোগ্যতা উন্নত করে এবং বাক্যবিন্যাসকে অনেক কম দ্বিধাগ্রস্থ করে তোলে যখন আপনার এমন অক্ষর থাকে যা পরবর্তীগুলির সাথে কমান্ড প্রতিস্থাপনের অভ্যন্তরে আক্ষরিক হয়ে উঠতে ব্যাকস্ল্যাশ-পলায়ন হওয়া দরকার।
চার্লস ডাফি

667

যদি ব্যাশ ব্যবহার করা হয় তবে সেড, বেসনাম, পুনঃনামকরণ, এক্সপ্রেস ইত্যাদির মতো বাহ্যিক কমান্ডের প্রয়োজন নেই

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

12
এবং যদি আপনি ফাইল এক্সটেনশানটি না জানেন তবে আপনি ব্যবহার করতে পারেন "${file%.*}.txt"তবে ফাইলের জন্য এটি বিপজ্জনক হতে পারে ডাব্লু / ও মোটেও একটি এক্সটেনশান।
জেস

1
কারও কাছে এই কাজটি করতে আমার যেমন কষ্ট হয়েছে তা নোট করুন: লক্ষ্য করুন যে $কোঁকড়া ধনুর্বন্ধনীগুলির ভিতরে কোনও নেই !
দউগ 65536

5
এই উত্তরটি স্থায়ীভাবে পছন্দ / বুকমার্ক করার জন্য আমার একটি উপায় দরকার, আমি সঠিক বাক্য
গঠনটি

7
@ ফালিপ শতকরা সাইন-ইন-ব্র্যাকেট শেষ প্রান্তে স্ট্রিপ অক্ষর তৈরি করে। এখানে একটি হ্যাশ-ইন-ব্র্যাকেট কনস্ট্রাক্ট রয়েছে যা অক্ষরের শুরু থেকে আলাদা করে দেয়। এটি পরীক্ষা করে দেখুন: tldp.org/LDP/abs/html/parameter-substedia.html#PSUB2

4
আর একটি স্ট্যাক এক্সচেঞ্জ উত্তর (যা আমি খুঁজে পাচ্ছি না!) এটি প্রস্তাবিত করেছে, তবে --"অপারেটর": এমভি - "$ ফাইল" "" $ {ফাইল% .html} .txt " ব্যবহার করেও সেই অপারেটর ফাইলগুলির নামগুলি শুরু করে যা শুরু হয় একটি '-' যুক্তি হিসাবে এমভি দ্বারা বিভক্ত হওয়া থেকে।
rcreswick

191
rename 's/\.html$/\.txt/' *.html

আপনি যা চান ঠিক তাই করে


আমি মনে করি না আপনি যেমন প্রস্তাবিত তেমন কোনও আক্ষরিক রেজেক্স ব্যবহার করতে পারেন - আপনি কোন শেল ব্যবহার করছেন?
ডেভের

1
আমি একটি ম্যাক টার্মিনাল ব্যবহার করছি
bmw0128

উবুন্টু নাম পরিবর্তন করার সংস্করণটির জন্য ম্যান পেজটি এখানে রয়েছে: unixhelp.ed.ac.uk/CGI/man-cgi?rename
অ্যাম্বার

পুনঃনামকরণ কিছু সিস্টেমে একটি কমান্ড। আমার কাছে পার্ল স্ক্রিপ্ট রয়েছে (মূলত প্রথম উট বইয়ের) যা কাজটি করে। একই নামের একটি জিএনইউ প্রোগ্রামও রয়েছে যা প্রায় একই কাজ করে। আমার ম্যাকের কোনও সিস্টেম-সরবরাহিত 'পুনর্নবীকরণ' কমান্ড নেই - বা এটি আমার রাস্তায় নেই (যা পরিমিতরূপে বিস্তৃত)।
জোনাথন লেফলার

হোমব্রুতে একটি নতুন নাম সূত্র রয়েছে।
রেভিপ্রেজ

112

এটি OSX এ আমার কাছে .txt থেকে .txt_bak এ কাজ করেছে

find . -name '*.txt' -exec sh -c 'mv "$0" "${0%.txt}.txt_bak"' {} \;

4
লিনাক্সে খুব সূক্ষ্ম কাজ করে।
ডিজেট

এটি বিন্দুটি ছাড়াও, তবে আপনার কাছ থেকে .txtযেতে .txt_bakহবে কেবল _bak
সমঝোতা

3
পুনরাবৃত্তভাবে পুনঃনামকরণের জন্য এটি দুর্দান্ত
লেআচার্যব

গ্রেট! (উবুন্টু ১.0.০৪ এর অধীনে) আমার ব্যবহারিক ব্যবহারের কেস, সবার নাম পরিবর্তন .scssকরে .sass( স্থানান্তরিত হওয়ার পরে…):find . -name '*.scss' -exec sh -c 'mv "$0" "${0%.scss}.sass"' {} \;
ফ্রাঙ্ক নোক

2
এটি +6000 ফাইলের সাথে কাজ করেছে, নাম প্রকাশিত হয়েছে "যুক্তি তালিকা খুব দীর্ঘ ছিল"
টনি ক্রোনিন

94

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

rename -S .html .txt *.html

এটি ঠিক আছে আপনি যা চান তা - এটি থেকে এক্সটেনশন পরিবর্তন করতে হবে .htmlকরতে .txtসব ম্যাচিং ফাইলের জন্য *.html

দ্রষ্টব্য: গ্রেগ হিউগিল সঠিকভাবে উল্লেখ করেছেন এটি কোনও ব্যাশ বিল্টিন নয়; এটি একটি পৃথক লিনাক্স কমান্ড। আপনার যদি লিনাক্সের কিছু প্রয়োজন হয় তবে এটি ঠিকঠাক কাজ করা উচিত; আপনার যদি আরও কিছু ক্রস প্ল্যাটফর্মের প্রয়োজন হয় তবে অন্য উত্তরগুলির মধ্যে একটিতে একবার দেখুন।


7
যদিও এটি একটি ভাল সমাধান, তবে renameপ্রোগ্রামটি সম্পর্কিত নয় bashএবং এটি সমস্ত প্ল্যাটফর্মেও উপলভ্য নয়। আমি এটি কেবল লিনাক্সে দেখেছি।
গ্রেগ হিউগিল

15
"$ পুনঃনামকরণ। এইচটিএমএল। টেক্সট * .এইচটিএমএল" এর ফলাফল ... সিনেটাক্স ত্রুটিতে (ইওওয়াল 1) লাইন 1 এর নিকটে, "।"
অ্যাম্বার

8
সঠিক বাক্য গঠন rename -S .html .text *.htmlযেখানে -Sদাঁড়িয়ে আছে--subst-all
মেরেক সেবেরা

8
ব্রিউ ইনস্টলের নাম পরিবর্তন করুন
নিক

4
@ গ্রেগ হিউগিল
নামটি



9

এটি হ'ল স্লোস্টেস্ট সলিউশন যা আমি পেয়েছি যে ওএসএক্স এবং লিনাক্সে কাজ করে এবং এটি গিটের সাথেও দুর্দান্তভাবে কাজ করে!

find . -name "*.js" -exec bash -c 'mv "$1" "${1%.js}".tsx' - '{}' \;

এবং গিট সহ:

find . -name "*.js" -exec bash -c 'git mv "$1" "${1%.js}".tsx' - '{}' \;


8

পুনর্নবীকরণ কমান্ডের একটি উদাহরণ এখানে দেওয়া হয়েছে:

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

6

এই প্রশ্নে স্পষ্টভাবে বাশকে উল্লেখ করা হয়েছে, তবে যদি আপনার কাছে জেডএসএইচ উপলব্ধ থাকে তবে এটি বেশ সহজ:

zmv '(*).*' '$1.txt'

যদি আপনি পান zsh: command not found: zmvতবে কেবল চালান:

autoload -U zmv

এবং তারপরে আবার চেষ্টা করুন।

Zmv সম্পর্কে টিপ জন্য এই মূল নিবন্ধ ধন্যবাদ ।


4

অন্য কারও ওয়েবসাইট ক্রল হওয়ার পরে, আমি উপ-ডিরেক্টরিগুলির বিস্তৃত বৃক্ষ জুড়ে হাজার হাজার ফাইলকে .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"

যদিও প্রয়োজন ঠিক করুন: ফাইলের নামগুলিতে ফাঁক দিয়ে কাজ করে


4

কমান্ডmmv (ক দ্বিতীয় অযুত) ফাইল একটি বিশাল সংখ্যার উপর খুব দক্ষতার সঙ্গে এই কাজের না বলে মনে হয়। উদাহরণস্বরূপ, সমস্ত .xmlফাইলের ফাইলের নাম পরিবর্তন .htmlকরতে, এটি ব্যবহার করুন:

mmv ";*.xml" "#1#2.html"

;পথ ম্যাচ হবে, *ফাইলের নাম ম্যাচ হবে, এবং এই হিসেবে উল্লেখ করা হয় #1এবং #2প্রতিস্থাপন নামে।

উপর ভিত্তি করে উত্তর execপাইপগুলির বা পাইপগুলির খুব ধীরে ধীরে বা খুব বড় সংখ্যক ফাইলে ব্যর্থ হয়েছিল।



3

পার্টিতে কিছুটা দেরি। আপনি এটি 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' - {}

3
নং পার্স নাls । এই কমান্ডটি হাস্যকর: এটি lsসরাসরি গ্লোব ব্যবহারের পরিবর্তে অকার্যকরভাবে একটি গ্লোব ব্যবহার করে। এটি ফাঁকা স্থান, উক্তি এবং (কোটের অভাবের কারণে) গ্লোব অক্ষরগুলি সহ ফাইলের নামগুলি ভেঙে দেবে।
gniourf_gniourf

এফওয়াইআই, আপনার লিঙ্ক করা নিবন্ধটিতে একটি আপডেট নোট রয়েছে যা বলেছে যে নতুন এলএস 'টার্মিনালে প্রিন্ট করা থাকলে ফাইলগুলি সঠিকভাবে "শেল পলায়ন" করে' ' আপনার পয়েন্টটি যদিও এখনও থাম্বের একটি ভাল নিয়ম।
ক্যাটাস্টিক ভয়েজ

3

একাধিক এক্সটেনশানগুলি একবারে সংশোধন করার জন্য এটি একটি ভাল উপায়:

for fname in *.{mp4,avi}
do
   mv -v "$fname" "${fname%.???}.mkv"
done

দ্রষ্টব্য: এক্সটেনশন আকারটি একই হতে সাবধান হন (???)


2

খুব সুন্দর!

find . -iname *.html  -exec mv {} "$(basename {} .html).text"  \;

2

আপনি যদি পিইআরএল পছন্দ করেন তবে একটি সংক্ষিপ্ত পার্ল স্ক্রিপ্ট রয়েছে (মূলত লেরি ওয়াল লিখেছেন, পিইআরএল এর স্রষ্টা) যা আপনি এখানে যা চান ঠিক তা করবে: টিপস.ওয়েবডিজাইন 10.com/files/rename.pl.txt

আপনার উদাহরণের জন্য নিম্নলিখিত কৌশলগুলি করা উচিত:

rename.pl 's/html/txt/' *.html

2
এই প্রশ্নের উত্তর ইতিমধ্যে দেওয়া হয়েছে এবং অনেক আগে স্বীকৃত হয়েছে এবং মনে হয় না যে আপনার উত্তর ইতিমধ্যে যা বলা হয়েছে তার চেয়ে বেশি কিছু এনেছে।
ক্রিস্টোফেলেক

1
+1 যেহেতু এটি ল্যারি ওয়াল স্ক্রিপ্ট ছিল (রবিন বার্কার দ্বারা পরিবর্তিত)। সর্বশেষ উপলভ্য ইউআরএলটি হ'ল: টিপস.উইবডিজাইন 10.com/files/rename.pl.txt
loretoparisi

1

আগে যা পরামর্শ দেওয়া হয়েছিল ঠিক তেমনই আমি এটিও করেছি:

find . -name '*OldText*' -exec sh -c 'mv "$0" "${0/OldText/NewText}"' {} \;

আমি প্রথম দিয়ে বৈধতা দিয়েছি

find . -name '*OldText*' -exec sh -c 'echo mv "$0" "${0/OldText/NewText}"' {} \;

1

একটি লাইন, লুপ নেই:

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

বাশ-একমাত্র উপায় দেখানোর জন্য +1 যা বিদ্যমান এক্সটেনশনের সাথে ঠিকঠাক মিলের উপর নির্ভর করে না। এটি কোনও ইনপুট এক্সটেনশনের জন্য কাজ করে, এটি 3 টি চর দীর্ঘ বা 4 টি চর দীর্ঘ বা তার বেশি
সিপ্রিয়ান টোমাইগা

0

দুর্ভাগ্যক্রমে এটি বহনযোগ্যভাবে করা তুচ্ছ নয়। আপনার সম্ভবত কিছুটা এক্সপ্রেস ম্যাজিক দরকার।

for file in *.html; do echo mv -- "$file" "$(expr "$file" : '\(.*\)\.html').txt"; done

আপনি যখন খুশি হন তখন প্রতিধ্বনিটি সরান।

সম্পাদনা: basename এই বিশেষ ক্ষেত্রে সম্ভবত কিছুটা বেশি পাঠযোগ্য, যদিও exprসাধারণভাবে এটি আরও নমনীয়।


যদিও এটি প্রশ্নের উত্তরের উত্তর নাও হতে পারে তবে তা আমার পক্ষে ছিল! আমার কেবল একটি ফাইলের নাম নয়, পুরো স্ট্রিংয়ে নতুন নামকরণের একটি উপায় প্রয়োজন। পোস্ট করার জন্য ধন্যবাদ!
ডোনাট

0

এখানে .edgeফাইলগুলির নাম পরিবর্তন করার জন্য আমি কী ব্যবহার করেছি.blade.php

for file in *.edge; do     mv "$file" "$(basename "$file" .edge).blade.php"; done

মোহন মত কাজ করে।


0

আপনি বাশে কোনও ফাংশনও তৈরি করতে পারেন, এটিতে .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


0

বর্তমান ডিরেক্টরি এবং সাব ডিরেক্টরি ডিরেক্টরিতে অন্য কোনও প্যাকেজ ছাড়াই সমস্ত ফাইলের জন্য ফাইল এক্সটেনশনের নাম পরিবর্তন করুন (কেবল শেল স্ক্রিপ্ট ব্যবহার করুন):

  1. rename.shনিম্নলিখিত ডিরেক্টরি সহ বর্তমান ডিরেক্টরিতে শেল স্ক্রিপ্ট তৈরি করুন :

    #!/bin/bash
    
    for file in $(find . -name "*$1"); do
      mv "$file" "${file%$1}$2"
    done
  2. এটি দিয়ে চালান ./rename.sh .old .new

    যেমন। ./rename.sh .html .txt

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