ফাইলের নামে স্ট্রিং প্রতিস্থাপন করে একাধিক ফাইলের নাম কীভাবে পরিবর্তন করবেন? এই স্ট্রিংটিতে একটি "#" রয়েছে


42

https://serverfault.com/questions/70939/how-to-replace-a-text-string-in-multiple-files-in-linux

https://serverfault.com/questions/228733/how-to-rename-multiple-files-by-replacing-word-in-file-name

https://serverfault.com/questions/212153/replace-string-in-files-with-certain-file-extension

https://serverfault.com/questions/33158/searching-a-number-of-files-for-a-string-in-linux

এই উল্লিখিত নিবন্ধগুলি আমার প্রশ্নের উত্তর দিয়েছে। তবে তাদের কেউই আমার পক্ষে কাজ করে না। আমি সন্দেহ করি এটি কারণ কারণ আমি যে স্ট্রিংটি প্রতিস্থাপন করার চেষ্টা করছি তার মধ্যে একটি # রয়েছে has এটিকে সম্বোধনের কোনও বিশেষ উপায় আছে কি?

আমার কাছে ইমেজ ফাইল আছে যা সাইট মাইগ্রেশনের সময় # U00a9 দ্বারা প্রতিস্থাপিত হয়েছিল had এগুলি দেখতে এরকম:

Lucky-#U00a9NBC-80x60.jpg
Lucky-#U00a9NBC-125x125.jpg
Lucky-#U00a9NBC-150x150.jpg
Lucky-#U00a9NBC-250x250.jpg
Lucky-#U00a9NBC-282x232.jpg
Lucky-#U00a9NBC-300x150.jpg
Lucky-#U00a9NBC-300x200.jpg
Lucky-#U00a9NBC-300x250.jpg
Lucky-#U00a9NBC-360x240.jpg
Lucky-#U00a9NBC-400x250.jpg
Lucky-#U00a9NBC-430x270.jpg
Lucky-#U00a9NBC-480x240.jpg
Lucky-#U00a9NBC-600x240.jpg
Lucky-#U00a9NBC-600x250.jpg
Lucky-#U00a9NBC.jpg

এবং আমি এটিকে এমন কিছুতে পরিবর্তন করতে চাই:

Lucky-safeNBC-80x60.jpg
Lucky-safeNBC-125x125.jpg
Lucky-safeNBC-150x150.jpg
Lucky-safeNBC-250x250.jpg
Lucky-safeNBC-282x232.jpg
Lucky-safeNBC-300x150.jpg
Lucky-safeNBC-300x200.jpg
Lucky-safeNBC-300x250.jpg
Lucky-safeNBC-360x240.jpg
Lucky-safeNBC-400x250.jpg
Lucky-safeNBC-430x270.jpg
Lucky-safeNBC-480x240.jpg
Lucky-safeNBC-600x240.jpg
Lucky-safeNBC-600x250.jpg
Lucky-safeNBC.jpg

হালনাগাদ:

এই উদাহরণগুলি সমস্ত "LU00a9ucky দিয়ে শুরু হয় তবে এখানে বিভিন্ন নাম সহ অনেকগুলি চিত্র রয়েছে I" নিরাপদ "দিয়ে প্রতিস্থাপন করার জন্য আমি কেবল স্ট্রিংয়ের" # U00a9 "অংশটিকে লক্ষ্য করছি।


3
তাহলে আপনি আসলে কি চেষ্টা করেছেন? আমি দেখতে পাচ্ছি যে আপনি কয়েকটি প্রশ্নের সাথে লিঙ্ক করেছেন এবং বলেছেন যে তারা ব্যর্থ হয়েছে, তবে কীভাবে তারা ব্যর্থ হয়েছিল? আইএমও সেরা উদাহরণ renameকমান্ডটি ব্যবহার করে । আমি সন্দেহ করি যে আপনার নামটি এত সহজ হবে rename -n 's/#/safeNBC/' *.jpg
জোরডাচি

আমি চেষ্টা করেছিলাম rename -n 's/#U00a9/safe/' *.jpgএবং আদেশটি গ্রহণ করা হয়েছিল কিন্তু কোনও পরিবর্তন হয়নি।

নিশ্চিত, আপনি ডকুমেন্টেশন আপনি নিশ্চয় পর্যালোচনা থেকে দেখা যেত হিসাবে, -nহয় no actবিকল্প। এটি আপনাকে ব্যবহার করার আগে এটি কাজ করে কিনা তা আপনাকে দেখতে দেয়। স্ক্রিনের আউটপুট কি সম্ভাব্য নতুন নামগুলি সঠিকভাবে প্রদর্শন করেছে?
জোড়াদেচে

আমি ক্ষমাপ্রার্থনা করি আমি সম্পূর্ণ মনোযোগ না দিয়েই আপনার উদাহরণ অনুলিপি করে আটকালাম, আমি -n ছাড়া পুনর্নবীকরণ কমান্ডটি করেছি। আমি বিশ্বাস করি @ ডিটি কে সমস্যা সমাধান করেছেন, আমি # এড়ানোর চেষ্টা করছিলাম না।

MacOS এর উপর ফাইলের নামের মধ্যে স্ট্রিং প্রতিস্থাপন করা হচ্ছে: superuser.com/questions/152627/...
আন্তন Tarasenko

উত্তর:


64

প্রতিস্থাপন করতে #দ্বারা somethingelseবর্তমান ডিরেক্টরী (রিকার্সিভ নয়) আপনি ব্যবহার করতে পারেন মধ্যে ফাইলের নামের জন্য গনুহ পুনঃনামকরণ উপযোগিতা:

rename  's/#/somethingelse/' *

এর মতো চরিত্রগুলি -অবশ্যই একটি দিয়ে পালাতে হবে \

আপনার ক্ষেত্রে, আপনি ব্যবহার করতে চান

rename 's/#U00a9/safe/g' *

মনে রাখবেন যে আপনি যদি কেবলমাত্র ফাইলগুলির একটি নির্দিষ্ট নির্বাচনের উপর পরিচালনা করতে চান তবে কেবলমাত্র *.jpgসেই নির্বাচনটি মেলে চূড়ান্ত ইনপুটটি সামঞ্জস্য করুন:

rename 's/#U00a9/safe/g' *.jpg

আসলে ফাইলের নাম পরিবর্তন করার আগে একটি পরীক্ষা করার জন্য, -nপতাকাটি ব্যবহার করুন :

demo/> ls                               
Lucky-#U00a9NBC-125x125.jpg  
Lucky-#U00a9NBC-150x150.jpg 

demo/> rename -n 's/#U00a9/safe/g' *.jpg
rename(Lucky-#U00a9NBC-125x125.jpg, Lucky-safeNBC-125x125.jpg)
rename(Lucky-#U00a9NBC-150x150.jpg, Lucky-safeNBC-150x150.jpg)

OS X এর জন্য, গনুহ পুনঃনামকরণ ব্যবহার ইনস্টল করা যাবে homebrew : brew install rename


এটি আমার মেশিনে (আর্চ লিনাক্স) কাজ করে নি, তবে মিকের উত্তরটি তা করেছে।
মার্চভ্যানেজেন্ড

@ মার্কাভেন্ড্যান্ড আপনি কোন সংস্করণটি renameব্যবহার করছেন? # sudo pacman -S perl-renameপার্ল সংস্করণ ইনস্টল করবে, যা আরও শক্তিশালী এবং উত্তরটি আপনার জন্য কাজ করতে যথেষ্ট হতে পারে।
জন গাওয়ার্স

@ জনগওয়ার্স ধন্যবাদ! আমি বুঝতে পারি না যে এখানে দুটি সংস্করণ রয়েছে। আমার সিস্টেমে, rename --versionরিটার্ন করুন rename from util-linux 2.29.2যাতে প্রকৃতপক্ষে পার্ল সংস্করণ নয়।
মার্চভানজেন্ড

5
দুটি সাধারণ renameইউটিলিটি রয়েছে তবে সেগুলির দুটিও জিএনইউ দ্বারা বিকাশিত নয়: ডিবিয়ান-ভিত্তিক বিতরণগুলিতে renameতাদের পার্ল প্যাকেজ সহ একটি ইউটিলিটি অন্তর্ভুক্ত রয়েছে এবং রেড হ্যাট-ভিত্তিক বিতরণগুলি লিনাক্স কার্নেল সংস্থার থেকে renameইউটিলিটিটি ব্যবহার করে util-linux। আপনার লিঙ্কটি জিএনইউ স্ট্যান্ডার্ড লাইব্রেরি থেকে renameসি ফাংশনটির
অ্যান্টনি জি - মনিকার পক্ষে

2
এই উত্তরটি কেন আমরা লিখতে করতে হবে /gসালেrename 's/#U00a9/safe/g' *
নিখিল

21

ফাইলগুলির তালিকা সন্ধান করুন এবং তারপরে কীওয়ার্ডটি প্রতিস্থাপন করুন। নীচে উদাহরণ

find . -name '*jpg' -exec bash -c ' mv $0 ${0/\#U00a9NBC/safeNBC}' {} \;

1
আপনার mvযুক্তিগুলির আশেপাশে আপনার কিছু ডাবল-কোট দরকার , যদি নামে ফাঁকা স্থান থাকে
হার্মিং মনিকা বন্ধ করুন

আমার সমস্ত ফাইল * _spec.rb- কে * _controller_spec.rb এ প্রতিস্থাপন করা দরকার এবং আপনার সমাধান আমার পক্ষে কাজ করেছে। ধন্যবাদ।
jedi

18

এটি শক্ত নয়, কেবল বিপরীত-স্ল্যাশ (\) প্রিপেন্ড করে নামে অষ্টকর্প (#) এড়িয়ে চলা নিশ্চিত করুন।

find . -type f -name 'Lucky-*' | while read FILE ; do
    newfile="$(echo ${FILE} |sed -e 's/\\#U00a9/safe/')" ;
    mv "${FILE}" "${newfile}" ;
done 

আপনার ব্যাখ্যাটি বোধগম্য হয়, #আমার যা প্রয়োজন তার মতো শব্দগুলি এড়িয়ে চলা । আমি আপনার উদাহরণটিতে একটি ব্যাকস্ল্যাশ দেখতে পাচ্ছি না। এটি দেখতে যেমন দেখতে হবে: s/\#U00a9/safe/

পছন্দ করুন এটি ব্যাকস্ল্যাশ গ্রাস করেছে। আমি সংশোধন করব।

17

#শেল থেকে বাঁচতে কেবল একক উদ্ধৃতি ( '#'), ডাবল উদ্ধৃতি ( "#"), বা ব্যাকস্ল্যাশ ( \#) ব্যবহার করুন।

আপনার ক্ষেত্রে সবচেয়ে সহজ renameহ'ল কমান্ডটি ব্যবহার করা (যদি এটি উপলব্ধ থাকে):

rename '#U00a9' safe *.jpg

2
ধন্যবাদ। সর্বাধিক ভোট প্রাপ্ত উত্তর ( rename 's/#/somethingelse/' *) আমার মেশিনে (আর্চ লিনাক্স) কাজ করে নি, এটি একটি করেছে।
মার্চভ্যানজেন্ড

1
এটি ইউজার-লিনাক্স থেকে পুনর্নবীকরণ কমান্ড ব্যবহার করে কাজ করে।
4:44

10

কীভাবে সেড করবেন তা নিশ্চিত নন, তবে আপনি এটি ব্যাশ শেলের মাধ্যমে চেষ্টা করতে পারেন:

for f in Lucky-#U00a9NBC-*.jpg; do mv -v "$f" "${f/#U00a9/safe}"; done;

ব্যাখ্যা:

  1. বিশ্বব্যাপী সমস্ত ফাইলের নামের সাথে মিল রেখে (লাকী- # U00a9NBC - *। jpg)
  2. মুভ কমান্ড (এমভি) ব্যবহার করে ফাইলটির নাম পরিবর্তন করে
  3. নতুন নাম কারুকাজ করতে স্থানীয় বাশ প্যারামিটার বিকল্প itution {var / প্যাটার্ন / প্রতিস্থাপন ment ব্যবহার করে ("$ {f / # U00a9 / নিরাপদ}")

প্যারামিটার প্রতিস্থাপনের বিষয়ে আরও (যা অত্যন্ত কার্যকর আইএমও): http://www.tldp.org/LDP/abs/html/parameter-substedia.html


যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, এটি নিজেই খুব কার্যকর নয়। এটি কীভাবে সমস্যার সমাধান করে তা ব্যাখ্যা করা উত্তরের উপযোগিতা এবং দীর্ঘমেয়াদী মানকে উন্নত করবে।
অ্যান্টনি জি - মনিকার পক্ষে ন্যায়বিচার

অ্যান্টনির মন্তব্য অনুসারে ওয়াকথ্রো ব্যাখ্যা এবং আরও পড়া যুক্ত করেছেন।
গ্রেগরি প্যাটমোর

1

উপরের উদাহরণগুলি আমার সিস্টেমে (CentOS 5.6) কাজ করে না তাই আমি একটি (সম্ভবত আরও সিস্টেম-নির্দিষ্ট) কমান্ড পেয়েছি যা কাজ করে (দ্রষ্টব্য: \কমান্ড লাইনের সাহায্যে '#' এড়াতে হবে ):

rename \#U00a9 safe *.jpg

[এছাড়াও: মন্তব্য করার মতো আমার এখনও যথেষ্ট খ্যাতি নেই, সুতরাং নিখিল /gইন ব্যবহার সম্পর্কিত প্রশ্নের জবাবে rename 's/old_string/new_string/g'(উপরের অন্য উত্তরের মন্তব্যে পোজ দেওয়া হয়েছে):

ব্যবহার করুন gএকটি 'বৈশ্বিক' প্রতিকল্পন সম্পাদন করতে পরিবর্তক (যে old_string ঘটে যতবার যেমন old_string জন্য new_string খেলোয়াড়রা)। এটি আমার উত্তরে প্রয়োজনীয় হওয়া উচিত নয় কারণ renameসুনির্দিষ্ট সমস্ত ফাইলগুলিতে প্রয়োগ করা হবে *। এটি এবং অন্যান্য সংশোধনকারীদের সংক্ষিপ্ত ব্যাখ্যার জন্য https://www.computerhope.com/unix/rename.htm দেখুন ]


সঠিক; সেন্টোসের মতো ফেডোরা ডেরিভেড ওএসের renameডেবিয়ান-ডেরিভেড ওএসের চেয়ে আলাদা সংস্করণ রয়েছে । Unix.stackexchange.com/a/238862/135943 দেখুন । এবং যাইহোক, CentOS 5.6 বেশ পুরানো এবং আমি আপনাকে আপগ্রেড করার পরামর্শ দিই।
ওয়াইল্ডকার্ড

আহ, ব্যাখ্যার জন্য ধন্যবাদ + লিঙ্ক। পুরানো ওএস কাজ করছে এবং তাই আপগ্রেড করা আমার পক্ষে নয় :) তবে একটি নতুন ক্লাস্টার তৈরি হচ্ছে এবং সম্ভবত আমরা যখন এগিয়ে যাব তখন আমরা আপগ্রেড করব ...
এজরা সিট্রন

0

পুনরায় ব্যবহারযোগ্য বাশ ফাংশনে মোড়ানো ডিটি কে এর সমাধান:

function renameFilesRecursively () {

  SEARCH_PATH="$1"
  SEARCH="$2"
  REPLACE="$3"

  find ${SEARCH_PATH} -type f -name "*${SEARCH}*" | while read FILENAME ; do
      NEW_FILENAME="$(echo ${FILENAME} | sed -e "s/${SEARCH}/${REPLACE}/g")";
      mv "${FILENAME}" "${NEW_FILENAME}";
  done

}

আপনি এটি কীভাবে ব্যবহার করতে পারেন তা এখানে:

renameFilesRecursively /home/user/my-files apple orange

0

প্রকৃতপক্ষে renameডাকা --substবা -sসংক্ষেপে ঠিক এর জন্য একটি বিকল্প রয়েছে option রেজেক্স সিনট্যাক্স ব্যবহার করার দরকার নেই।

rename -s '#U00a9' 'safe' *

আপনি যদি একাধিক ঘটনা প্রতিস্থাপন / প্রতিস্থাপন করতে চান তবে ব্যবহার করুন --subst-allবা -S

বিটিডাব্লু, আমি কেবল কোনও কিছু দিয়ে স্ট্রিং প্রতিস্থাপন করতে চেয়েছিলাম (ফাইলের নাম থেকে এটি সরিয়ে ফেলুন) ... ভাল আমাদের কাছে এর জন্য একটি বিকল্প রয়েছে -d/--deleteএবং -D/--delete-all:

rename -d '#U00a9' *

-1

আরেকটি বিকল্পটি হ'ল pyRenamerব্যাচটির নামকরণের জন্য বিশেষত তৈরি একটি অ্যাপ্লিকেশন।

এটি দিয়ে ইনস্টল করা যেতে পারে sudo apt-get install pyrenamer

ব্যবহারের বিশদগুলির জন্য, গিটহাবের এটির README ফাইলটি দেখুন


1
আপনি যদি সত্যিই মনে করেন এটি প্রশ্নের উত্তর দিতে পারে তবে আপনার উত্তরে কিছু ব্যাখ্যা যুক্ত করুন। এটি কেবল একটি প্যাকেজ ইনস্টল করে। কমান্ডটি কী করে তা আপনাকে ব্যাখ্যা করা উচিত এবং একটি উদাহরণ সরবরাহ করা উচিত যা ওপি'র নির্দিষ্ট প্রয়োজনীয়তা পরিচালনা করে।
রোয়াইমা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.