বর্তমান ডিরেক্টরিগুলির সমস্ত ফাইলের নামের সাথে একটি চরকে কীভাবে প্রতিস্থাপন করবেন?


41

আপনি বর্তমান ফোল্ডারে সমস্ত ফাইল / সাবডিয়ারের কীভাবে নাম পরিবর্তন করবেন?

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

File 1
File 2
File 3
Dir 1
Dir 3

নামকরণ করা উচিত

File_1
File_2
File_3
Dir_1
Dir_3

উত্তর:


36

আপনার যদি সাব ডাইরেক্টরিগুলিতেও ফাইলগুলির নাম পরিবর্তন করতে হয় এবং আপনার প্রাকটিকে findসমর্থন করে -execdirতবে আপনি এটি করতে পারেন

find /search/path -depth -name '* *' \
    -execdir bash -c 'mv -- "$1" "${1// /_}"' bash {} \;

আমাকে এবং ভাবতে বাধ্য করার জন্য -depthবিকল্পটি প্রস্তাব করার জন্য @ লেগন জ্যাকম্যানকে ধন্যবাদ find

নোট করুন যে কয়েকটি সিস্টেমে (জিএনইউ / লিনাক্স সহ) findফাইলগুলি খুঁজে পেতে ব্যর্থ হতে পারে যার নামগুলিতে ফাঁকা স্থান রয়েছে এবং বাইটের ক্রমও রয়েছে যা বৈধ অক্ষর তৈরি করে না (একটি চরসেটে এনকোড থাকা নন-এএসসিআইআই অক্ষরযুক্ত মিডিয়া ফাইলগুলির সাথে সাধারণত) লোকেলের থেকে পৃথক)। লোকেলটি সেট করা C(যেমন হিসাবে LC_ALL=C find...) সমস্যার সমাধান করবে।


find -maxdepth 1ওপি বর্তমান ফোল্ডারে অপারেটিং সম্পর্কে যা বলেছিল ঠিক তা করতে আপনাকে ব্যবহার করতে হবে।
কালেব

1
সন্ধানের -depthবিকল্পটি ব্যবহার করুন এবং আপনি এ থেকে মুক্তি পেতে পারেন sort
গ্লেন জ্যাকম্যান

@ লেগন জ্যাকম্যান: আপনাকে ধন্যবাদ, আমি এখন বুঝতে পারি যে আমার সমাধানটি ভুল ছিল।
এনজোটিব

2
পরিবর্তন -name '* *'করার জন্য -name '*_*'এবং পরিবর্তন "${1// /_}"করার জন্য"${1//_/.}"
enzotib

1
@ ক্রোজ: একে "প্যাটার্ন সাবস্টিটিউশন" বলা হয়। আপনি এটির bashম্যান পেজে খুঁজে পেতে পারেন ।
এনজোটিব

34

যে কোনও শেল-এ, আপনি যে ফাইলগুলির নামের সাথে একটি স্থান রয়েছে সেগুলি দিয়ে আপনি লুপ করতে পারেন। আন্ডারস্কোরগুলির সাথে স্পেসগুলি প্রতিস্থাপন করা ${VARIABLE//PATTERN/REPLACEMENT}কনস্ট্রাক্টের সাথে ব্যাশ, ksh এবং zsh এ সহজ ।

for x in *" "*; do
  mv -- "$x" "${x// /_}"
done

ডেবিয়ান, উবুন্টু এবং ডেরিভেটিভগুলিতে আপনি পার্লটি ব্যবহার করতে পারেন rename(অন্যান্য বিতরণগুলি কোনও আলাদা প্রোগ্রাম পাঠায় renameএবং সেই প্রোগ্রামটি এখানে সহায়ক নয়)।

rename 's/ /_/g' *

একটি বাধ্যতামূলক zsh সমাধান:

autoload zmv
zmv '(*)' '${1// /_}'

একটি বাধ্যতামূলক পসিক্স সমাধান:

for x in *" "*; do
  y=$(printf %sa "$x" | tr " " "_")
  mv -- "$x" "${y%a}"
done

"পুনরায় নামকরণ" কমান্ডের শেষে 'জি' এর অর্থ কী? আমি ম্যানুয়ালটিতে দেখিনি।
জুলিয়ানলাই

শুধুমাত্র ডিরেক্টরিটির নামকরণ কীভাবে করবেন? আমি ফাইলের নাম পরিবর্তন করতে চাই না।
জুলিয়ানলাই

@ জুলিয়ানলাই s/…/…/gমানে সমস্ত ঘটনা প্রতিস্থাপন করা। এটি ম্যানুয়ালটিতে খুব ভালভাবে ব্যাখ্যা করা হয়নি । আপনি যদি ডিরেক্টরিগুলির নাম পরিবর্তন করতে চান তবে উপায় আছে, দয়া করে এটি অনুসন্ধান করুন (আমার মনে হয় আমি এটি আগে দেখেছি) এবং যদি এটি খুঁজে না পান তবে একটি নতুন প্রশ্ন জিজ্ঞাসা করুন।
গিলস 23'11

মহান ... এই আমাকে সমস্ত নামান্তর করতে সাহায্য করেছে _MG_blah.JPGকরার IMG_blah.JPG
অবিনাশ ড্যাশ

13

আপনি renameএটির জন্য ব্যবহার করতে পারেন (এখানে থেকে একটিকে ধরে নিচ্ছেন util-linux, এটি নয় perl):

cd /path/to/dir
rename ' ' _ *\ *

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

আপনি যদি পুনরাবৃত্ত হওয়া ম্যাচগুলি করতে চান তবে আপনি renameনিজের নামে নতুন নামকরণ করা ডিরেক্টরিতে যে কোনও আইটেম ধরতে আপনাকে কয়েকবার সম্পাদন করতে হবে:

cd /path/to/dir
shopt -s globstar
rename ' ' _ **/*\ *
!!; !!

2
" renameপ্রতিস্থাপন দ্বারা নির্দিষ্ট ফাইল নামান্তর হবে প্রথম সংঘটন থেকে দ্বারা তাদের নামে করার তাই এই শুধুমাত্র তাদের নামটি দিয়ে একটি একক স্থান সঙ্গে ফাইলের জন্য কাজ করবে।"। (আপনি renameএকটি লুপে ডাকতে পারেন , তবে এটি এখানে সঠিক সরঞ্জাম নয়))
গিলস '

2

আর একটি বিকল্প হ'ল mmv, যদি ইনস্টল করা থাকে।

mmv \*\ \* \#1_#2

এটি কেবল প্রথম স্থানকে ক এ পরিবর্তিত করে _, এটি একাধিক স্পেস সহ নামগুলি কাজ করে না।
গিলস 'অশুভ হওয়া বন্ধ করুন'

ওফস, আপনি ঠিক বলেছেন। বিভ্রান্তির জন্য দুঃখিত.
glglgl

1

কালেব এবং গিলসের উত্তরের ভিত্তিতে ডেবিয়ান / উবুন্টুতে, ফাইলগুলির পুনরাবৃত্তভাবে নামকরণের জন্য এটিই আমার পক্ষে কাজ করেছিল:

cd /path/to/dir
shopt -s globstar
rename 's/ /_/g' **

দ্রষ্টব্য: কোন ফাইলগুলির নাম পরিবর্তন করা হবে এবং কীভাবে তা পূর্বরূপ দেখতে, এর -nসাথে স্যুইচটি ব্যবহার করুন rename:

rename -n 's/ /_/g' **

আরেকটি নোট: সেটিং globstarতোলে **সমস্ত সাব-ফাইল মেলে, তাই যদি শুধুমাত্র বর্তমান ডিরেক্টরির পছন্দসই হয়, সেট globstar না বা ব্যবহার *পরিবর্তে **

আরও একটি নোট: renameঅনুসন্ধান শব্দটির একাধিক উপস্থিতিযুক্ত ফাইলগুলির জন্য কমান্ডটি একাধিকবার চালানো দরকার।


ডিরেক্টরিগুলি ফাঁকা স্থান না থাকলে কেবল এটি কাজ করে। (একটি পুনঃনামকরণ a b/c dকরার a_b/c_dকাজ করতে না চায়, আপনি নামান্তর করতে প্রথম প্রয়োজন চাই a b/c dথেকে a b/c_d, এবং তারপর a bথেকে a_b)।
স্টাফেন চেজেলাস

@Stephane: কি এটি একই চালানোর জন্য অর্থ renameকমান্ড দুইবার?
মারকাস Pscheidt

ঠিক আছে, স্পেসস সহ ডিরেক্টরিগুলির নেস্টেড স্তর রয়েছে যতবার। আদর্শভাবে, আপনি প্রথমে ডিরেক্টরি গভীরতা অতিক্রম করতে চান, এবং কেবলমাত্র ফাইলের বেসনামটিকে গ্রহণযোগ্য সমাধান হিসাবে রূপান্তর করতে চান। এছাড়াও লক্ষ করুন যে **বাশের ডটফাইলগুলি বাদ দেয় এবং সিমলিংকগুলি অনুসরণ করে।
Stéphane Chazelas

0

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

আমি এটি প্রায়শই ব্যবহার করি না, তবে আমি যখন করি তখন এটি কাজটি দ্রুত এবং সহজেই হয়ে যায়। ডাউনলোড করা বিভিন্ন মিডিয়া ফাইলগুলির নাম পরিবর্তন করার সময় এটি সত্যই কার্যকর হয় যাতে আপনি এগুলি আপনার সিস্টেমে অভিন্নভাবে পরিচালনা করতে পারেন। এটি আলাদাভাবে ক্রেনাম ম্যানুয়াল ডাউনলোড করতে সহায়তা করে যাতে আপনি প্রোগ্রামটি ব্যবহার করার সময় এটি উল্লেখ করতে পারেন।

http://www.krename.net/

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