বাল্কের নতুন নামকরণ, উপসর্গ পরিবর্তন করুন


53

আমি কীভাবে অনেকগুলি ফাইলের উপসর্গটি প্রতিস্থাপন করতে পারি?

আমার মতো অনেকগুলি ফাইল রয়েছে

  • TestSRConnectionContext.h
  • TestSRConnectionContext.m

আমি তাদের সব পরিবর্তন করতে চাই

  • CLConnectionContext.h
  • CLConnectionContext.m

আমি এই কিভাবে করব?

উত্তর:


38
for name in TestSR*
do
    newname=CL"$(echo "$name" | cut -c7-)"
    mv "$name" "$newname"
done

এর মাধ্যমে ইনপুট ফাইলের নাম থেকে প্রথম 6 অক্ষর মুছে ফেলার জন্য ব্যাশ কমান্ড প্রতিকল্পন ব্যবহার cut, prepends CLফলাফলের জন্য, এবং দোকান যে $newname। তারপরে এটি পুরানো নামটির নতুন নামকরণ করে। এটি প্রতিটি ফাইলে সম্পাদিত হয়।

cut -c7-নির্দিষ্ট করে যে ইনডেক্স 7 পরে কেবল অক্ষরগুলি ইনপুট থেকে ফিরে আসতে হবে। 7-সূচি 7 এ শুরু হওয়া একটি পরিসীমা নয় যার শেষ রয়েছে; অর্থাৎ লাইন শেষ হওয়া অবধি।

পূর্বে, আমি ব্যবহার করেছিলাম cut -b7-, তবে -cপরিবর্তে ইউটিএফ -8 এর মতো অক্ষর প্রতি একাধিক বাইট থাকতে পারে এমন অক্ষর এনকোডিংগুলি পরিচালনা করতে ব্যবহার করা উচিত।


থেক্স, আমি নিজেই এখনই এটি পেয়েছি। উত্তর হিসাবে চিহ্নিত করা হচ্ছে। ধন্যবা
ErikTJ

ধন্যবাদ, এটি সুন্দরভাবে কাজ করে। -বি 7- কী করে আপনি ব্যাখ্যা করতে পারেন? এই রেফারেন্সটি কি বাইট-তালিকার জন্য? ss64.com/bash/cut.html
সজ্জিত

@ আইমজারেড আরও বিশদ সহ উত্তরটি আপডেট করেছেন।
এমআরবি

56

আমি কেবল সহজ renameকমান্ডটি ব্যবহার করতে চাই যা অনেক লিনাক্স বিতরণে প্রচলিত। এই কমান্ডের দুটি সাধারণ সংস্করণ রয়েছে সুতরাং আপনার কোনটি রয়েছে তা খুঁজে পেতে এর ম্যান পৃষ্ঠাটি পরীক্ষা করুন:

## rename from Perl (common in Debian systems -- Ubuntu, Mint, ...)
rename 's/^TestSR/CL/' *

## rename from util-linux-ng (common in Fedora systems, Red Hat, CentOS, ...)
rename TestSR CL *

আপনি যদি কোনও ডেবিয়ান সিস্টেমে ইউজার-লিনাক্স-এনজি থেকে সংস্করণটি ব্যবহার করতে চান তবে এটি নাম অনুসারে উপলভ্য rename.ul


7
একটি সতর্কতামূলক: renameবন্য মধ্যে একাধিক সংস্করণ বিদ্যমান। renameকীভাবে আপনার নিজের ব্যবহার করবেন তা নির্ধারণ করতে আপনার স্থানীয় ডকুমেন্টেশন পরীক্ষা করুন ।
jw013

rename TestSR '' *
উপকরণটি

হুম ... rename "\<pre\>" "" *->Unterminated <> operator at (user-supplied code).
ফ্ল্যাশ থান্ডার

32

শেল প্যারামিটার সম্প্রসারণ এর মতো সহজ রূপান্তরগুলির জন্য যথেষ্ট। অতিরিক্ত প্রক্রিয়া চালানোর প্রয়োজনীয়তার কারণে কমান্ড প্রতিস্থাপন কম দক্ষ হয় (কমান্ড প্রতিস্থাপনের জন্য এবং cut/ sed)।

for f in TestSR*; do mv "$f" "CL${f#TestSR}"; done

ব্যাখ্যা: TestSR*ফাইলগুলি সন্ধান করে, CL${f#TestSR}নতুন নাম হবে। উইলের পরে #থাকা স্টাফগুলি ফাইলের নাম ( f) থেকে প্রতিস্থাপন করা হবে ।
জো এফের্ট

4

এখানে একটি উপায়:

ls *.{h,m} | while read a; do n=CL$(echo $a | sed -e 's/^Test//'); mv $a $n; done
  • ls *.{h,m} -> .h বা .m এক্সটেনশন সহ সমস্ত ফাইল সন্ধান করুন
  • n=CL -> ফাইলের নামের সাথে একটি সিএল উপসর্গ যুক্ত করুন
  • sed -e 's/^Test//' -> ফাইলের নাম থেকে পরীক্ষার উপসর্গ সরিয়ে দেয়
  • mv $a $n -> নামটি সম্পাদন করে

3

আপনি এটি দিয়ে চেষ্টা করতে পারেন:

for i in TestSR*; do mv ${i} ${i/#TestSR/CL}; done

দেখুন man bashবিস্তারিত জানার জন্য (অধ্যায় "প্যারামিটারটি সম্প্রসারণ")।


1

ঠিক আছে, যদিও এটি আমার মতো কঠিন ছিল না।

$ for f in TestSR*.m; do mv $f CL$(echo $f | cut -c7-); done;
$ for f in TestSR*.h; do mv $f CL$(echo $f | cut -c7-); done;

1
ভবিষ্যতের জন্য এটি যদি সহায়তা করে তবে আপনার দুটি প্যাটার্নের জন্য আদেশগুলি পুনরাবৃত্তি করতে হবে না; আপনি (উদাহরণস্বরূপ) ব্যবহার করতে পারেন: for f in TestSR*.[mh], for f in TestSR*.{m,h}, for f in TestSR*.m TestSR*.h
mrb

1

আপনার যদি আরও জটিল কিছু প্রয়োজন হয় তবে আপনি এটি করতে পারেন

perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.