আমি একাধিক ফাইলের এক্সটেনশন কীভাবে পরিবর্তন করব?


166

আমি থেকে একটি ফাইল এক্সটেনশন পরিবর্তন করতে চান *.txtকরতে *.textbasenameকমান্ডটি ব্যবহার করার চেষ্টা করেছি , তবে একাধিক ফাইল পরিবর্তন করতে আমার সমস্যা হচ্ছে।

আমার কোডটি এখানে:

files=`ls -1 *.txt`

for x in $files
do
    mv $x "`basename $files .txt`.text"
done

আমি এই ত্রুটি পাচ্ছি:

basename: too many arguments Try basename --help' for more information

এ কিছু ধারনা peteryu.ca/tutorials/shellscripting/batch_rename খুব
নিমো

উত্তর:


175

সোজা গ্রেগের উইকি থেকে :

# সমস্ত নাম পরিবর্তন করুন। .Txt থেকে * .text
f এর জন্য * .txt; করা
    mv - "$ f" "$ {f% .txt}। পাঠ্য"
সম্পন্ন

আপনার বিশ্লেষণls কেন করা উচিত নয় সে বিষয়ে এন্ট্রিটিও দেখুন ।

সম্পাদনা করুন: basenameআপনার সিনট্যাক্সটি ব্যবহার করতে পারলে তা হ'ল:

f এর জন্য * .txt; করা
    mv - "$ f" "$ (বেস নাম -" $ f ".txt)। পাঠ্য"
সম্পন্ন

48
ব্যাখ্যা ব্যতিরেকে এখানে কিছুটা উন্নত বাশ বাক্য গঠন ব্যবহার করা হয়েছে। এটি পুরোপুরি বুঝতে আমার কাছে গুগলের কাছে অনেক কিছুই ছিল। অন্যকে আমার অবস্থানে সহায়তা করতে এখানে গ্লোব ( *.txtসিনট্যাক্স) , বেয়ার ডাবল ড্যাশ-- এবং কনস্ট্রাক্টের মধ্যে% চিহ্নের ব্যবহার${} সম্পর্কে কিছু উল্লেখ রয়েছে । এখনও অবধি আমি এই দ্বিতীয়টির মুখোমুখি হই নি এবং পূর্বের সাথে আসলে কী ঘটছিল তা আমি জানতাম না।
মার্ক অ্যামেরি

3
মাথিয়াস ব্রাউনের নীচের উত্তরটি দেখুন - অনেক সরল, একই জিনিসটি সম্পাদন করে।
বিটিকে

10
একটি লাইনারfor f in *.txt; do mv -- "$f" "${f%.txt}.text"; done
মারিয়াল জুয়ান

1
আপনার অনুপস্থিত; পাঠ্যের পরে "।"
পেটুর ইনগি এগিলসন

2
@ পাতুরইঙ্গিইগিলসন দ্বিতীয় লাইনে? না, এটি প্রয়োজন হয় না।
জেসনওয়ারিয়ান

132

এখানে আমি কীভাবে দেবিয়ানের বর্তমান ডিরেক্টরিতে সমস্ত ফাইল এক্সটেনশন পরিবর্তন করি।

rename "s/oldExtension/newExtension/" *.txt

(এটি পার্ল renameকমান্ড, util-linuxএক নয়। দেখুন কেন দেবিয়ান / উবুন্টু নামকরণের ইউটিলিটি সেন্টোসের মতো অন্যান্য বিতরণের চেয়ে আলাদা? )


10
গৃহীত উত্তরের চেয়ে অনেক সহজ, আপনাকে ধন্যবাদ!
বিটিকে

8
ম্যাক এ আমি সক্ষম হয়েছি brew install renameএবং এটি কাজ করতে পারি।
Monkpit

3
ফিশ শেল দিয়ে আপনি rename "s/oldExtension/newExtension/" **.txtসমস্ত * .txt পুনরাবৃত্তভাবে নতুন নামকরণ করতে পারেন
পামস্ট্রোস্ট

3
এটি ব্যর্থ হবে footxt.txt। পরিবর্তে এটি ব্যবহার করুন: unix.stackexchange.com/questions/19654/…
উইসবাকী

7
যখন আপনার ফাইলে কোনও এক্সটেনশন নেই এবং আপনি একটি যুক্ত করতে চান:rename 's/$/.txt/' *
মকতাজা

34

একটি সাধারণ কমান্ড, এর renameথেকেutil-linux , এটি আপনার জন্য করবে, এটি "টেক্সট" এর প্রতিটি উপস্থিতি সমস্ত ফাইলের সাথে "" .txt "মিলে" টেক্সট "এ প্রতিস্থাপন করে:

rename txt text *.txt

4
renameপ্রথম সংঘটন পরিবর্তিত হয়, সুতরাং ভাল যে rename .txt .text, কিন্তু এই এখনও সবসময় কাজ করবে না (যেমন এটা renames foo.txtx.bar.txtকরতে foo.textx.bar.txt)।
গিলস

12
এটি লক্ষ করা উচিত যে সমস্ত সিস্টেমে পুনরায় নামকরণের একই সংস্করণ নেই; ডেবিয়ান এবং বন্ধুদের উপর, renameকমান্ডটি আসলে perl-renameএবং পার্ল রেজেক্সগুলি ব্যবহার করে। এটার জন্য সমতুল্য কমান্ড হবে: rename 's/.txt/.text/' *.txt। লোকেরা man renameতাদের সিস্টেমে চেক করা উচিত যা তাদের রয়েছে কিনা তা খুঁজে বের করার জন্য।
অরিসপপ

@evilsoup যে জন্য ওএসএক্স, ধন্যবা ক্ষেত্রে
Davi লিমা

এটি সাইগউইন (উইন্ডোজ)
এ্যান্ডি

27
rename "s/oldExtension/newExtension/" *.txt

উপরে সূক্ষ্ম কাজ করে তবে বর্তমান ডিরেক্টরিতে সীমাবদ্ধ। নীচের কমান্ডটি ব্যবহার করে দেখুন, যা উপ-ডিরেক্টরিতে নমনীয়। এটি .txtএকটি নতুন এক্সটেনশন দিয়ে ডিরেক্টরি কাঠামোর অধীনে সমস্ত ফাইলের নাম পরিবর্তন করবে ।

find . -name "*.txt" -exec rename 's/.txt$/.newext/' {} \;

2
renameএকাধিক ফাইলকে আর্গুমেন্ট হিসাবে পরিচালনা করতে পারে, এ জাতীয় অনেকগুলি ফাইল রয়েছে +তার পরিবর্তে আপনি ব্যবহার করে জিনিসগুলিকে ব্যাপক গতি বাড়িয়ে তুলতে \;পারেন
অ্যান্থন

তবুও, এটি একটি দরকারী বিকল্প যেহেতু "* .txt" শেল দ্বারা অসমর্থিত একটি বড় আর্গুমেন্ট তালিকায় তালিকাভুক্ত হতে পারে।
রোমান শাপোভালভ

1
"s / পুরানো এক্সটেনশন / নতুন এক্সটেনশন /" এর জন্য ব্যর্থ হবে footxt.txt। পরিবর্তে এটি ব্যবহার করুন: unix.stackexchange.com/questions/19654/…
উইসবাকী


9

এখানে উল্লেখ রেফারেন্সিং s/oldExtension/newExtension/ভুল। আপনি যদি ব্যবহার করেন তবে আপনি s/txt/text/রূপান্তর footxt.txtকরবেন footext.txtযা আপনি চান তা নয়। এমনকি যদি আপনি ব্যবহার করেন তবে s/.txt/.text/তা রূপান্তরিত footxt.txtহবে fo.text.txt

পিরিয়ডটি \.ম্যাচ করতে আপনাকে ব্যবহার করতে .হবে ( কোনও চরিত্রের সাথে মেলে)। এবং $লাইনের শেষের সাথে মেলাতে পিছনে । শুধুমাত্র এটি এক্সটেনশনের সাথে সঠিকভাবে মিলবে।

rename 's/\.txt$/.text/' *.txt

rename 's/\.old$/.new/' *.old

7

@Prince জন ওয়েসলি উত্তর উপর ভিত্তি করে, এখান থেকে বর্তমান ডিরেক্টরির মধ্যে ফাইলের সকল এক্সটেনশান পরিবর্তন করার জন্য একটি সহজ ব্যাশ স্ক্রিপ্ট হয় ext1থেকে ext2। পুনরায় নামকরণ করা ফাইলগুলির নামও আউটপুট করে।

#!/bin/bash
for f in *.$1
do
    [ -f "$f" ] && mv -v "$f" "${f%$1}$2"
done

ব্যবহারের উদাহরণ (স্ক্রিপ্টের নামটি ধরে নিলে change-ext):

change-ext ext1 ext2

ডিরেক্টরিতে পুনরাবৃত্তভাবে ফাইলগুলির এক্সটেনশন পরিবর্তন করতে, দ্বিতীয় লাইন ( for...) দুটি লাইনের সাথে প্রতিস্থাপন করুন : shopt -s globstarএবং for f in **/*.$1। বাশ 4+ প্রয়োজন।
ডেনিস গোলোমাজভ

4

Zsh এ পরিবর্তন করতে কারণ # 53:

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


3

ধরা যাক আপনার ফাইলগুলি বিভিন্ন ডিরেক্টরিতে ছড়িয়ে ছিটিয়ে আছে, ধরে নিই যে ডাইরক্সটি আপনার মূল ডিরেক্টরি, এটি সন্ধান করে কাজটি করতে পারে:

for f in `find /dirx -iname '*.txt' -type f -print`;do  mv "$f" ${f%.txt}.text; done



2

যখন তুমি

উত্স ফাইলগুলির জন্য কোনও এক্সটেনশন নেই

এবং টার্গেট এক্সটেনশন হ'ল টেক্সট আপনি এটি এইভাবে করতেন -

for f in *; do mv -- "$f" "${f%.\*}.text"; done

1
দুর্দান্ত বাশ-নেটিভ স্ক্রিপ্ট। দুর্দান্ত কাজ! for f in *.html; do mv -- "$f" "${f%.\*}.pug"; done
তমুসজেরোয়েস

1

যদি আপনি জানতে চান যে আপনার সংস্করণে কী ভুল হয়েছে: আপনি বেসনেম কমান্ডের $filesপরিবর্তে ব্যবহার করেছেন $x। সুতরাং এটি কাজ করা উচিত (অনির্ধারিত, যদিও):

for x in *.txt
do
  mv "$x" "`basename '$x' .txt`.text"
done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.