এক্সটেনশন ব্যতীত আন্ডারস্কোর দিয়ে ফাইলের নামে ডটগুলি প্রতিস্থাপন করা


9

কেউ কীভাবে ফাইলটির নাম পরিবর্তন করতে পারেন সে বিষয়ে পরামর্শ দিতে পারে:

head.body.date.txt

প্রতি:

head_body_date.txt

ইউনিক্সে নতুন নামকরণের জন্য কি একক লাইন বিবৃতি রয়েছে ?


9
আপনি কি ধরে নিয়েছেন যে .tar.gzএটি একটি এক্সটেনশন? এছাড়াও, ইউএন্ডএলকে স্বাগতম!
ইকনস

2
আপনি কি আসলেই লিনাক্সের বিপরীতে ইউনিক্সকে বোঝাচ্ছেন? কোন ইউনিক্স?
টেরডন

1
সুস্পষ্ট উত্তরটি হ'ল mv head.body.date.txt head_body_date.txt। আপনার যদি অন্য বিধিনিষেধ বা বাস্তব উদাহরণ থাকে তবে দয়া করে এগুলি দিয়ে আপনার প্রশ্নটি আপডেট করুন। এখন যেমন দাঁড়িয়ে আছে, প্রশ্নটি সেই স্পষ্ট নামযুক্ত কোনও ফাইলকে বোঝায় কিনা, এমন একক ডিরেক্টরি যেখানে সমস্ত ফাইলের একটি নির্দিষ্ট ফর্ম্যাট রয়েছে বা আপনি যদি নির্দিষ্ট নামের জন্য একটি ডিরেক্টরি শ্রেণিবিন্যাস অনুসন্ধান করতে চান এবং এগুলি পরিবর্তন করতে চান তবে এটি স্পষ্ট নয়।
কুসালানন্দ

উত্তর:


9

ফাইলের নামগুলি দিয়ে আইট্রেট করুন এবং রূপান্তরকরণের জন্য প্যারামিটার সম্প্রসারণ ব্যবহার করুন:

for f in *.*.*.txt; do i="${f%.txt}"; echo mv -i -- "$f" "${i//./_}.txt"; done

পরামিতি সম্প্রসারণ প্যাটার্ন, ${f//./_}সব প্রতিস্থাপন .সঙ্গে গুলি _ফাইলের নাম মধ্যে গুলি ( $f)।

প্রকৃত নামকরণের জন্য উপরেরগুলি একটি শুকনো রান করবে, সরান echo:

for f in *.*.*.txt; do i="${f%.txt}"; mv -i -- "$f" "${i//./_}.txt"; done

আপনি যদি কোনও এক্সটেনশান নিয়ে ডিল করতে চান তবে কেবল .txt:

for f in *.*.*.*; do pre="${f%.*}"; suf="${f##*.}"; \
                     echo mv -i -- "$f" "${pre//./_}.${suf}"; done

echoপ্রকৃত পদক্ষেপের জন্য অপসারণ পরীক্ষা করার পরে :

for f in *.*.*.*; do pre="${f%.*}"; suf="${f##*.}"; \
                     mv -i -- "$f" "${pre//./_}.${suf}"; done

জেনেরিক, বিন্দু নির্বিচার সংখ্যার জন্য, কমপক্ষে একটি:

for f in *.*; do pre="${f%.*}"; suf="${f##*.}"; \
                 mv -i -- "$f" "${pre//./_}.${suf}"; done

সেখানে বিন্দু নির্বিচারে সংখ্যা আছে যদি একটি সাধারণ উপায় আছে?
সিপরিয়ান টোমাইগ

1
@ সিপ্রিয়ানটোমিয়াগা দো:for f in *.*; do ...; done
হিমাইল

আমি *.*উদাহরণটিতে সরাসরি প্যাটার্নটি রাখার পরামর্শ দিতে পারি , যেহেতু এখন কোডটি মনে হচ্ছে এটি কেবল একটি নির্দিষ্ট সংখ্যক বিন্দুর সাথে কাজ করে।
ilkkachu

@ ইলক্কাচু মেলা যথেষ্ট সম্পাদিত।
হিমাইল

আপনাকে অনেক ধন্যবাদ হিমেয়, এটি আমার পক্ষে কাজ করেছিল। এবং কিছু শেখার!
এসজি

4

perlভিত্তিক সঙ্গেrename

$ rename -n 's/\.[^.]+$(*SKIP)(*F)|\./_/g' head.body.date.txt 
rename(head.body.date.txt, head_body_date.txt)
  • \.[^.]+$(*SKIP)(*F) এই প্যাটার্নটি এড়িয়ে যান এবং বিকল্প মিলগুলি দেখুন
  • |\./_/g.সঙ্গে সব প্রতিস্থাপন_

বা, নেতিবাচক লুক হেড ব্যবহার করে

$ rename -n 's/\.(?![^.]+$)/_/g' head.body.date.txt 
rename(head.body.date.txt, head_body_date.txt)

এটি ঠিক হয়ে গেলে -nবিকল্পটি সরান


3
rename 's/\.(?=[^.]*\.)/_/g' *.txt

.ফাইল নেম- এর শেষ দৃষ্টান্তটি ছাড়া সমস্ত খুঁজে পাওয়ার জন্য রিজেক্স রিপ্লেসমেন্ট ব্যবহার করে (নন-ক্যাপচারিং লুকএহেড) এবং সেগুলি প্রতিস্থাপন করুন _*.*আপনার পছন্দ হলে সাধারণীকরণ করুন ।

(এই নির্দিষ্ট সংস্করণটি এর renameমাধ্যমে ইনস্টল করা আছে বলে মনে হয় util-linux)। আমি ব্যবহার করছি Ubuntu 12.04(হ্যাঁ, মারাত্মকভাবে তারিখের মেশিনের বাইরে চলে গেছে)।


2

bash:

old=head.body.date.txt oldb=${old%.*} olde=${old##*.} ; \
mv -- "$old" "${oldb//./_}.${olde}"

(1) আপনার শুরু হওয়া mv --"পুরানো" ফাইল নামগুলির বিরুদ্ধে রক্ষা করার জন্য ব্যবহার করা উচিত -। (২) আপনার শেল (যেমন এবং ) এর জন্য বিশেষ যে স্থানগুলি বা অক্ষর রয়েছে সেগুলি "পুরাতন" ফাইলনামগুলির বিরুদ্ধে রক্ষা করার জন্য আপনার $oldউদ্ধৃতিগুলি ( "$old") লিখতে হবে । (3) আপনার উত্তরটি কিছুটা প্যাথলজিকাল ক্ষেত্রে ব্যর্থ হয় যেখানে এক্সটেনশনে একটি আন্ডারস্কোর থাকে: নামকরণ হয় । *?head.body.date.t_xthead_body_date_t.xt
স্কট

@ স্কট, ধন্যবাদ। উল্লিখিত তিনটি আইটেম অনুযায়ী কোডটি এখন টুইট করা হয়েছে।
এজিসি

1

ব্যবহার mv, sedএবং revএক লাইন মধ্যে:

mv "head.body.date.txt" "$(echo head.body.date.txt | rev | sed 's/\./_/2g' | rev)"

আপনি যদি txtবর্তমান রেপটিতে সমস্ত ফাইলগুলিতে এটি প্রয়োগ করতে চান তবে গ্লোবগুলি ব্যবহার করা জটিল বলে মনে হয় কীভাবে mvকাজ করে তবে আপনি forওয়ান-লাইনারে লুপ করতে পারেন :

for file in *.txt; do mv "$file" "$(echo $file | rev | sed 's/\./_/2g' | rev)"; done

কিছুটা লম্বা, তবে আপনি নিজের লুপে বেশ কয়েকটি নিদর্শন মেলাতে পারেন!


2
(1) আরঘঃ! করবেন না $(ls …); শুধু কি for file in *.txt। (2) আপনি আরও কোট ব্যবহার করা উচিত: mv "$file" "$(…)"
স্কট

ধন্যবাদ স্কট, যথাযথভাবে উল্লেখ এবং সম্পাদিত! আমি এখনও শেলের যুবক, দয়া করে নম্র হোন;)
ভ্যালেন্টিন বি।

অন্ধকারে, renameবেশ কয়েকটি অন্যের মতো তাদের জবাবগুলি ব্যবহার করা তাদের জবাবগুলিতে আরও সহজ বলে মনে হচ্ছে ...
ভ্যালেন্টিন বি।

-1
 mv head.body.date.txt head_body_date.txt

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

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