আমি কীভাবে পুনরাবৃত্তির সাথে বড় হাতের অক্ষরে নাম পরিবর্তন করতে পুনরায় নাম ব্যবহার করতে পারি


11

আমি পুনরাবৃত্তভাবে সমস্ত ফাইল এবং ফোল্ডার (সাব-ফোল্ডার) এর বড় হাতের নাম পরিবর্তন করতে চাই।

আমি এমন কিছু স্ক্রিপ্ট পেয়েছি যা এটি ছোট হাতের জন্য করবে তবে আমি কীভাবে সেগুলি পরিবর্তন করব তা জানি না এটি এটি অন্য উপায়ে (নীচে থেকে উপরের দিকে) করবে।

আমি যে স্ক্রিপ্টটি খুঁজে পেয়েছি এবং ছোট হাতের জন্য কাজ করি, কিন্তু কীভাবে সংশোধন করতে হয় তা আমি জানতাম না:

rename 'y/A-Z/a-z/' *

এটা থেকে man rename


পুনর্নবীকরণ কমান্ড সম্পর্কে কিছু না জেনে আমার সন্দেহ হয় যে আপনি চেষ্টা করলে আপনি rename 'y/a-z/A-Z/' *যা চান তা পেয়ে যাবেন। আপনি যেখানে এটি পরীক্ষা করছেন সেদিকে যত্নশীল।
ওয়ারউইক

এটি পুনরাবৃত্তির সাথে হয় না (কারণ প্রাথমিকটি ছিল না ...) তবে এটি কার্যকর হয়। আমি বুঝতে পারি না কেন আমি সেই ভুলটি কেন চেষ্টা করিনি :), তারপরে!
jnhghy - আলেকজান্দ্রু জান্তে

আমি মনে করি যে গিলসের উত্তরের গুণমান দেওয়া হয়েছে, আপনি যদি আমার উত্তরকে অগ্রাধিকার দিয়ে তার উত্তরটি গ্রহণ করেন তবে তা ভাল হবে। এটি আমার চেয়ে অনেক বেশি সম্পূর্ণ এবং আপনার বিকল্পগুলি ব্যাখ্যা করে (এবং এটি কীভাবে কাজ করে)। ধন্যবাদ।
ওয়ারউইক

উত্তর:


8

মনে রাখবেন আপনি ডেলিয়ান এবং ডেরিভেটিভস (উবুন্টু, পুদিনা,…) দ্বারা বিতরণকৃত পার্ল স্ক্রিপ্টটিrename ব্যবহার করছেন । অন্যান্য লিনাক্স ডিস্ট্রিবিউশনগুলি সম্পূর্ণ পৃথক, এবং যথেষ্ট কম কার্যকর, জাহাজটি ডাকা হয় rename

y/A-Z/a-z/সীমার মধ্যে প্রতিটি অক্ষর অনুবাদ Aমাধ্যমে Zব্যাপ্তিতে সংশ্লিষ্ট চরিত্র মধ্যে aদিয়ে zসংশ্লিষ্ট ছোট হাতের অক্ষর থেকে অর্থাত হওয়া ASCII বড়হাতের অক্ষর। বিপরীত অনুবাদ সম্পাদন করতে, ব্যবহার করুন y/a-z/A-Z/। আরেকটি উপায় একই কমান্ড লিখতে rename '$_ = uc($_)' *ucহয় তোমার দর্শন লগ করা pper ASE ফাংশন, এবং renameকমান্ড তৈরি রূপান্তর উপর ভিত্তি করে ফাইল renames $_পরিবর্তনশীল।

rename '…' *কেবলমাত্র বর্তমান ডিরেক্টরিতে ফাইলগুলির নাম পরিবর্তন করে, কারণ এটি *মিলে যায়। ডট ফাইলগুলি (ফাইলগুলির নাম যার সাথে শুরু হয় .)ও এড়িয়ে যায়।

আপনি যদি বর্তমান ডিরেক্টরিতে এবং উপ-ডিরেক্টরিতে পুনরাবৃত্তভাবে ফাইলগুলির নাম পরিবর্তন করতে চান তবে আপনি বর্তমান ডিরেক্টরিটি পুনরাবৃত্তভাবে অনুসরণ করতে findআদেশটি ব্যবহার করতে পারেন । এখানে একটি অসুবিধা রয়েছে: আপনি যদি কল করেন তবে renameএটি ডিরেক্টরি এবং বেস নাম অংশ উভয়টিরই নাম পরিবর্তন করে। যদি আপনি renameকোনও ডিরেক্টরিতে এটি পুনরুক্ত করার আগে কল করেন ( find -exec rename … {} \;), তখন findএটি বিভ্রান্ত হয়ে পড়ে কারণ এটি একটি ডিরেক্টরি খুঁজে পেয়েছে তবে সেই ডিরেক্টরিটি এতে প্রবেশ করার চেষ্টা করার পরে আর উপস্থিত থাকবে না। আপনি findডিরেক্টরিটি অভিনয় করার আগে কোনও ডিরেক্টরিকে অতিক্রম করতে বলার মাধ্যমে এটিকে ঘিরে কাজ করতে পারেন , তবে তারপরে আপনি নাম পরিবর্তন foo/barকরার চেষ্টা করেছেন FOO/BARতবে ডিরেক্টরিটি FOOবিদ্যমান নেই।

এই অসুবিধাটি এড়ানোর একটি সহজ উপায় হ'ল নামকরণের আদেশটি কেবল পথের ভিত্তির নাম অংশে কাজ করা। নিয়মিত এক্সপ্রেশনটি ([^/]*\Z)পাথের চূড়ান্ত অংশের সাথে মেলে যা একটি নেই /

find . -depth -exec rename 's!([^/]*\Z)!uc($1)!e' {} +

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

ফাংশন zmvনিদর্শনগুলির উপর ভিত্তি করে ফাইলগুলির নাম পরিবর্তন করে। autoload -U zmvএটি সক্রিয় করতে একবার চালান (আপনার এই লাইনটি রাখুন .zshrc)।

zmv(প্রতিস্থাপনের ধরণ) এর প্রথম যুক্তিতে আপনি zsh এর শক্তিশালী ওয়াইল্ডকার্ড নিদর্শনগুলি ব্যবহার করতে পারেন । zmv(প্রতিস্থাপন পাঠ্য) এর দ্বিতীয় যুক্তিতে আপনি ইতিহাসের সংশোধকগুলি সহ এর প্যারামিটার সম্প্রসারণ বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন ।

zmv -w '**/*' '$1$2:u'

ব্যাখ্যা:

  • -w - প্রতিটি ওয়াইল্ডকার্ড প্যাটার্নে স্বয়ংক্রিয়ভাবে সংখ্যার ভেরিয়েবল নির্ধারণ করুন
  • **/*- উপ-ডিরেক্টরিতে সমস্ত ফাইল পুনরাবৃত্তভাবে ( **/0, 1 বা উপ-ডিরেক্টরিগুলির আরও স্তরের সাথে মেলে)
  • $1 - প্রথম সংখ্যার ভেরিয়েবল, এখানে প্রতিটি পাথের ডিরেক্টরি অংশের সাথে মিল রয়েছে
  • $2:u- দ্বিতীয় সংখ্যার ভেরিয়েবল, এখানে প্রতিটি পাথের বেস নামের অংশের সাথে :uমানটি বড় হাতের সাথে রূপান্তর করার পরিবর্তনের সাথে মিলছে

একটি যুক্ত বোনাস হিসাবে, এটি পরিবেষ্টিত লোকেল সেটিংসকে সম্মান করে।

আপনি যে zmvকমান্ডটি লিখেছিলেন সে সম্পর্কে আপনি যদি নিশ্চিত না হন তবে আপনি আদেশটি -nকী করবে এবং কিছু পরিবর্তন না করে তা মুদ্রণের বিকল্পটি পাস করতে পারেন । আউটপুটটি পরীক্ষা করে দেখুন এবং এটি যদি আপনি যা চান তা করে, -nআসলে কাজ না করে কমান্ডটি আবার চালান ।


5

গিলস পোস্ট থেকে এখানে চুরি (একটি ছোটখাট সম্পাদনা সহ)

find <DIR> -depth -type d -exec rename -n 's!/([^/]*/?)$!\U/$1!' {} +


এটি পুনরাবৃত্তির সাথে কাজ করে না।
গিলস 21:42-তে

সত্য। প্রশ্নটি আমার সঠিকভাবে পড়া উচিত ছিল। পুনর্নবীকরণ কমান্ডটিতে আমার অ্যাক্সেস নেই তবে আমি বিশ্বাস করি যে এটি পুনরাবৃত্তভাবে কাজ করবে -find <dir> -exec rename 'y/a-z/A-Z/' {} \;
ওয়ারউইক

এটি এর চেয়ে কিছুটা জটিল, কারণ আপনি ডিরেক্টরিগুলির findপুনরাবৃত্তি করার সময় ডিরেক্টরিগুলির নাম পরিবর্তন করছেন ।
গিলস'স'-দুষ্ট হওয়া বন্ধ করুন '

@ গিলস - ঠিক আছে কিছুটা গবেষণা করার পরে, দেখা যাচ্ছে যে ডিরেক্টরি নামগুলি সর্বশেষে পরিচালিত হয় যাতে এটির জন্য আমার -depth বিকল্পটি যুক্ত করতে হবে। সুতরাং find <dir> -depth -exec rename 'y/a-z/A-Z/' {} \;নামকরণ ডিরেক্টরি ইস্যু পরিচালনা করা উচিত। সঠিক?
ওয়ারউইক

না, এটি এখনও কাজ করে না, কারণ renameপরিবর্তনগুলি যেমন foo/barto সময়ে উপস্থিত রয়েছে FOO/BARএবং FOOনেই।
গিলস 'দুষ্ট হওয়া বন্ধ করুন'

2

গিলস কোয়ার্নোট যে উত্তরটির প্রয়োজন নেই তার উত্তরের উত্তরে যে উত্তরের সাথে এখনও এই উত্তরটির সাথে যুক্ত রয়েছেন তাকে আমি গাইড করতে চাই find

ফলাফলটি হ'ল:

shopt -s globstar
rename -n 'y/a-z/A-Z/' **

তবে দৌড়ানোর আগে দয়া করে পুরানো বাশ সংস্করণ সম্পর্কিত ক্যাভ্যাটগুলির জন্য যুক্ত উত্তরটি পড়ুন।

শেষ অবধি যদি কেউ ভাবছে যে y///কমান্ডটি কী করে perl regex। এখানে প্রাসঙ্গিক ডকুমেন্টেশনের লিঙ্ক ।


1

find -execdir| পুনঃনামকরণ

এটি করার সর্বোত্তম উপায় এটি যদি আপেক্ষিক পাথ পাগলামির জন্য না হয় তবে এটি কেবল বেসনেমে অভিনয় করতে পার্ল রেজেক্স ফু এড়িয়ে চলে:

PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
  find a -depth -execdir rename 's/(.*)/\U$1/' '{}' \;

-execdircdকেবলমাত্র বেসনেমে এক্সিকিউট করার আগে ডিরেক্টরিতে প্রথমে ।

দুর্ভাগ্যক্রমে, আমি সেই PATHহ্যাকিং অংশটি থেকে মুক্তি পেতে find -execdirপারি না, যদি আপনার কোনও আপেক্ষিক পথ থাকে তবে কিছু করতে অস্বীকার করি PATH...: https://askubuntu.com is-অনিরাপদ-জন্য-ডিরেক্টরি যা-is-ইন-দ্য-পাথ / 1109378 # 1109378


0

ডিরেক্টরিতে যাওয়ার পরে এটি চেষ্টা করুন যেখানে আপনি ফাইলগুলির নাম পরিবর্তন করতে চান:

for word in `ls -ltr |tail -n +2 |awk '{print $9}'`
do
  a=$(echo $word | tr '[a-z]' '[A-Z]')
  mv $word $a
  echo "Done Successfully"
done

Ls এর আউটপুটকে বিশ্লেষণ করবেন না (এবং পৃথিবীতে আপনি ls -lকেবল নাম বাদে অন্য কলামগুলি কাটতে দৌড়বেন কেন ?) এবং ভেরিয়েবল বিকল্পগুলির চারপাশে ডাবল উদ্ধৃতি ব্যবহার করুন । আপনার কোড অত্যধিক জটিল এবং সাদা নাম এবং অন্যান্য বিশেষ অক্ষরযুক্ত ফাইলের নামগুলিতে বিরতি। উপ-ডিরেক্টরিতে পুনরাবৃত্তি করতে findবা ব্যবহার **/করতে, এর আউটপুট lsকেবল মানুষের ব্যবহারের জন্য।
গিলস 21'45
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.