বাশের ক্ষেত্রে কেস বা প্রাথমিক ক্যাপস শুরু করতে পুনরায় নামকরণ করুন


3

একটি ডিরেক্টরিতে সমস্ত ফাইলের নতুন নামকরণের জন্য আমার অনলাইনার দরকার

SomeThing.TXT
একটি ফাইল নয় g
সংবেদনশীল লালা.ডোক

থেকে

Something.txt
একটি ফাইল.ওজি না
সংবেদনশীল লালালা.ডোক

অন্য কথায়: শব্দের প্রথম অক্ষর হ'ল বড় হাতের অক্ষর এবং অন্য সব কিছুই ছোট হাতের। একে স্টার্ট কেস বা প্রাথমিক ক্যাপস বলে । এটি "শিরোনাম কেস" এর খুব কাছাকাছি। ফাইল এক্সটেনশনটি ছোট আকারের হওয়া উচিত।

সর্বাধিক বিদ্যমান প্রশ্ন শুধুমাত্র সঙ্গে মোকাবিলা করার জন্য মনে UPPERCASE.MKV বা lowercase.mkv ফাইলের নাম, কেউ আবরণ বলে মনে হচ্ছে মূলধন Case.mkv ( উদাহরণস্বরূপ )।

পাইপ মত সব সাধারণ সরঞ্জাম, sed, perl, grepএবং আরো অনেক কিছু ব্যবহার করা যাবে।


আপনি কোন লিনাক্স ব্যবহার করছেন? এটি কি ডেবিয়ান ভিত্তিক?
টার্ডন

@terdon আর্ক লিনাক্স তবে আসুন এটির পক্ষে যথেষ্ট পোর্টেবল রাখুন। :)
'12 12:58 এ কোবডআপ

শুধু কি ভাবছেন আপনার renameকি। এটি কি আর্কে পার্ল ও বিএসডি এক?
টারডন

জন্য মালিক প্যাকেজ /usr/bin/renameহয় util-linux। একই নামের প্যাকেজperl-rename সহ একটি পৃথক কমান্ড ।
12 মিনিটে কোবডআপ

হ্যাঁ, অনেকগুলি সিস্টেম ইউজ-লিনাক্সকে ডিফল্ট হিসাবে পাঠায়। ঠিক আছে perl-rename, আপনার কাছে থাকলে আপনি আমার উত্তরটি ব্যবহার করতে পারেন। আমার ডেবিয়ানে এটি ওভাররাইট করার আগে সতর্ক করার দাবি করেছে তবে বাস্তবে তা করে না। আমি একটি শেল সংস্করণও যুক্ত করেছি যা ওভাররাইটিং এড়াতে পারে।
টার্ডন

উত্তর:


2

আপনার যদি পার্ল নাম পরিবর্তন করতে ( renameডিবিয়ান-ভিত্তিক সিস্টেমে ডিফল্টরূপে ইনস্টল করা রয়েছে , perl-renameঅন্য অনেকের মতো উপলব্ধ ), আপনি চালাতে পারেন:

rename  's/.*/lc($&)/e; s/(^| )./uc($&)/ge' *

ব্যাখ্যা:

renameপ্রোগ্রাম তার ইনপুট ফাইল নামের প্রতিটি একটি Perl অভিব্যক্তি চালানো হবে। এখানে, প্রথম প্রতিস্থাপন অপারেশন ( s///) .*নিজের সাথে ( ) $&যা কিছু মিলেছে) তবে ছোট কেসড ( lc($&)) কে প্রতিস্থাপন করবে । দ্বিতীয়টি, কোনও স্থানের পরে বা ফাইলের নাম ( (^| )) এর শুরুতে এবং প্রতিটি অক্ষরের সাথে এটির উচ্চতর কেসড সংস্করণ ( uc($&)) দিয়ে প্রতিস্থাপন করবে ।

-nকোনও পরিবর্তন না করে পরীক্ষার জন্য পতাকা নিয়ে চালান :

$ rename -n 's/.*/lc($&)/e; s/ ./uc($&)/ge' *
rename NOT A FILE.ogg not A File.ogg
rename sensitive lalala.doc sensitive Lalala.doc
rename SomeThing.TXT something.txt

আপনি শেল লুপ এবং পার্ল ব্যবহার করতে পারেন:

for f in *; do 
    mv "$f" "$(perl -lpe 's/.*/lc($&)/e; s/(^| )./uc($&)/ge' <<<"$f")"
done

এটি renameউপরের মত একই কমান্ড , কেবলমাত্র আমরা এটি ডিরেক্টরিতে প্রতিটি ফাইল ফিড করি এবং নাম পরিবর্তন করতে কমান্ড প্রতিস্থাপন ব্যবহার করি ।

বিদ্যমান ফাইলগুলি ওভাররাইট করা এড়াতে আপনি সহজেই এটি সংশোধন করতে পারেন:

for f in *; do 
    target="$(perl -lpe 's/.*/lc($&)/e; s/(^| )./uc($&)/ge' <<<"$f")"; 
    [ -e "$target" ] && 
        echo "File \"$target\" exists, skipping \"$f\"" || 
        mv "$f" "$target"; 
done

শেষ স্ক্রিপ্ট সত্যই কাজ করে। উবুন্টু (LTS 14.04.4 এল টি) তে দুর্ভাগ্যবশত প্রস্তাবিত প্রথম লাইন ব্যবধান সহ নাম ... সঙ্গে ত্রুটি উত্পন্ন ( /usr/bin/renameথেকে সিমবলিক লিঙ্ক /etc/alternatives/renameথেকে সিমবলিক লিঙ্ক /usr/bin/prename; Perl ফাইল RCSfile: নামান্তর, ভি পুনর্বিবেচনাসমূহ: 4.1)।
হাস্তুর

1

"ডি-ক্যাপিটালাইজিং" এখানে উত্তর দিয়েছে :

for i in *
do
  mv "$i" "$( echo $i | tr '[:upper:]' '[:lower:]')"
done

মূলধন এখানে ইতিমধ্যে উত্তর দেওয়া হয়েছে :

for i in *
do
  mv "$i" "$( echo $i | sed 's/[ ]*/\u&/g')"
done

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

সংযুক্ত উত্তর সংক্ষিপ্ত বিবরণ।
হামেদ

1

এটি Bash 3.2.57ম্যাক ওএসএক্সের জন্য কাজ করে

পূর্বরূপ (কিছুই পরিবর্তন করে না):

IFS=$'\n';FOLDER=new;for F in $(ls -1);do EXT="${F##*.}";NAME="${F%.*}";NEW=$(echo "$NAME"| perl -pe 's/[ _-]([A-z0-9])([^ _-]+)/ \U\1\L\2/g');echo "cp '$F' '$FOLDER/$NEW.$EXT'";done

পূর্বরূপটি দেখতে ভাল লাগলে আপনি সাবফোল্ডারটির নাম পরিবর্তন করতে এবং সিপি করতে এটি ব্যবহার করতে পারেন:

IFS=$'\n';FOLDER=new;[ -d $FOLDER ] || mkdir $FOLDER;for F in $(ls -1);do EXT="${F##*.}";NAME="${F%.*}";NEW=$(echo "$NAME"| perl -pe 's/[ _-]([A-z0-9])([^ _-]+)/ \U\1\L\2/g');cp -v "$F" "$FOLDER/$NEW.$EXT";done

নোট:

  • ফাইল এক্সটেনশন পরিবর্তন হবে না।
  • সংখ্যাগুলি সঠিকভাবে পরিচালনা করা উচিত।
  • আপনার যদি অন্যান্য অক্ষর থাকে তবে আপনি স্পেসে রূপান্তর করতে চান, কেবল তাদের অক্ষর শ্রেণিতে যুক্ত করুন: [ _-]
  • সাবফোল্ডারে প্রতিটি ফাইলের একটি অনুলিপি তৈরি করে বিরোধী নামগুলি এড়ান । এটি আপনাকে একটি "পূর্বাবস্থায়িত" বিকল্প দেয়। এটি হ্যান্ডেল করার অন্য উপায়টি হ'ল সমস্ত ফাইলের নাম পরিবর্তন করা, যেমন একটি উপসর্গ যুক্ত করার _My New File Name.jpgপরে, সমস্তগুলি এর পরিবর্তে সংস্করণে নামকরণ করা _

দুর্ভাগ্যক্রমে, এটি কোনও ফাইলের নামের প্রথম অক্ষরের নাম পরিবর্তন করে বলে মনে হচ্ছে না।
কুইবডআপ

1

আমি ওয়ান-লাইন আকারে একটি দ্রুত সমাধান নিয়ে এসেছি:

for f in *; do mv -i "$f" "`echo $f | sed -e 's/\(.*\)/\L\1/' -e 's/\( .\)/\U\1/g' -e 's/\(^.\)/\U\1/g'`"; done

বা পঠনযোগ্য (তবে পেস্ট ফর্মটি অনুলিপি করতে সামান্য কম স্বাচ্ছন্দ্যযুক্ত):

for f in *; do 
    mv -i "$f" "`echo $f | 
     sed -e 's/\(.*\)/\L\1/' -e 's/\( .\)/\U\1/g' -e 's/\(^.\)/\U\1/g'`"; 
done

এই কমান্ডের ব্যবহার sedকরতে mvএকই নামের একটি ফাইলে প্রতিটি ফাইল কিন্তু যা সমস্ত অক্ষর প্রথম ছোট হাতের অক্ষরে পরিণত , যেকোনো অক্ষর দ্বারা অনুসৃত স্থান সমন্নয়ের মাধ্যমে বড় হাতের, তারপর প্রথম অক্ষর পরিণত হয় বড় হাতের থেকে চালু আছে।

ওভাররাইট করার আগে এটি জিজ্ঞাসা করবে।

-iআপনি যদি এটি স্বয়ংক্রিয়ভাবে ওভাররাইট করতে চান তবে সরান ।

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