ফাইলগুলির নাম পরিবর্তন এবং অক্ষরগুলি কীভাবে প্রতিস্থাপন করবেন?


11

আমার :নামের মধ্যে একটি ফাইল রয়েছে (কোলন)। আমার :সাথে -(ড্যাশ) প্রতিস্থাপন করতে হবে ।

কোনও স্ক্রিপ্টে এটি করার সহজ উপায় কি আছে?

নমুনা ফাইলের নাম: 2013-10-11:11:52:08_055456663_045585_.txt

উত্তর:


17

একটি সাধারণ 1-রেখারটি shকরণীয় (অনুমান করুন পিক্সিক - সামঞ্জস্যপূর্ণ শেল):

for f in *:*; do mv -v "$f" $(echo "$f" | tr ':' '-'); done

ব্যাখ্যা:

  • for ... in ...; do ...; doneএকটি লুপ হয়

  • *:* বর্তমান ডিরেক্টরিতে সমস্ত ফাইল এবং ডিরেক্টরিগুলির সাথে মিল রয়েছে যা :তাদের নামে রয়েছে

  • f লুপের মধ্যে প্রতিটি ফাইলের নামের পরিবর্তে বরাদ্দ করা হয়

  • mvদ্বিতীয়টির সাথে তার প্রথম যুক্তির নাম পরিবর্তন করে; -v(ক্রিয়াপদ) এটি কী করে তা মুদ্রণ করতে বলে; এই বিকল্পটি জিএনইউ-ব্যবহারগুলি নির্দিষ্ট, সুতরাং এটি লিনাক্সে উপলব্ধ তবে সোলারিসে নয়

  • $(...) একটি উপ-শেল কোডটি কার্যকর করে এবং আউটপুট প্রতিস্থাপন করে

  • echo স্ট্যান্ডার্ড আউটপুটে তার যুক্তি মুদ্রণ করে

  • tr সরবরাহকৃত মানচিত্র অনুসারে মানক আউটপুট পড়ে এবং অক্ষর অনুবাদ করে

আপনি ব্যবহার করে থাকেন ব্যাশ , আপনি একটি অতিরিক্ত শেল (ডিম ছাড়ার এড়াতে পারেন $()উপ-প্রক্রিয়া) ( trপ্রতিস্থাপন দ্বারা) $(...)সঙ্গে ${f//:/-}


সাধারণ কাজের উত্তরের জন্য +1, যদিও এটি আরও কিছুটা ব্যাখ্যা দিয়ে করতে পারে। উদাহরণস্বরূপ for f in... লুপটি এমন একটি লুপ যা বর্তমান ডিরেক্টরিতে সমস্ত ফাইলের পুনরুক্তি করে যেখানে ফাইলগুলি মেলানো দরকার *:*। (যা মিলছে ডায়ারের সাথে কী ঘটে?)। মুভ কমান্ড হ'ল একটি মুভ পুরানো নাম নতুন নাম যেখানে শেলটি দিয়ে চালিয়ে নতুন নাম তৈরি করা হয় $( subshell here )। টিআর কী করে, ...
হেনেস

@Hennes: এই হয় সুপার-ইউজার - আমি সত্যিই বিবরণ এই ধরনের ঢোকা করতে হবে? ওহ ভাল, আপনি এখানে যান ...
sd

না। যদি সত্যিকারের প্রয়োজন হয় তবে আমি +1 করতাম না। এবং আমি বুঝতে পারি এটি কী করে। আমি মনে করি যদিও এটি অন্য অনেক পাঠকের পক্ষে ভাল।
হেনেস

2
আপনি এর $(echo "$f" | tr ':' '-')সাথে প্রতিস্থাপন করতে পারেন "${f//:/-}"এবং সাবশেল, পাইপ এবং বহিরাগত প্রোগ্রাম কল এড়াতে পারেন । আমি মনে করি এটি বাশিজম, তবে এহ। এখানে দেখুন
অশুচিপ

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

6

আমার অন্য পোস্টে যেমনটি বলা হয়েছে যে renameসরঞ্জামটি আপনার জন্য কৌশলটি করতে পারে। আপনাকে কেবল টাইপ rename s/:/-/ <files to rename> করতে হবে এটি শেষে আপনার নাম করা সমস্ত ফাইলে ড্যাশ সহ প্রতিটি কোলনকে প্রতিস্থাপন করে2013-10-*

আমার অন্যান্য পোস্টের লিঙ্কটি এখানে


1

আমি নিশ্চিত যে ইউনিক্সের একজন প্রো বাশ দিয়ে এটি করতে পারে তবে রুবি সহ আমার দ্রুত এবং নোংরা সংস্করণ এখানে।

path_to_files = "/home/username/wrongnames/"
filenames = `ls #{path_to_files}`.split
filenames.each do |fn|
  `mv #{path_to_files + fn} #{path_to_files + fn.gsub(/:/, "-")}`
end

আপনার ভুল নাম দেওয়া ফাইলের পথে path_to_files সেট করুন। উপরের কোডটি পুনঃনাম.আরবি নামে একটি ফাইলে সংরক্ষণ করুন:

username@machinename$ ruby rename.rb

@ এসএসএস আরও ভাল উত্তর সরবরাহ করে। আমার উত্তর মুছে ফেলা উচিত? আমি স্ট্যাকওভারফ্লোতে নতুন।
shupru

1
না; এটির এখনও উল্লেখযোগ্য মূল্য রয়েছে। :)
ব্ল্যাকলাইট জ্বলজ্বল

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

1

আপনার যদি মাত্র একটি বা কয়েকটি ফাইল থাকে তবে এটি আপনার জন্য নাম পরিবর্তন করতে পারে:

  1. ফাইলের নাম আপনি যদি একটি পরিবর্তনশীল হিসাবে লক্ষ্য করে ধরনে দোকান: p="201*"
  2. সঞ্চয় করুন পুরাতন ফাইলের নাম আপনি নামান্তর করতে চাই: old_name=$(ls | grep $p)
  3. সঞ্চয় করুন নতুন ফাইল নাম প্রয়োজনীয় অক্ষর প্রতিস্থাপন সঙ্গে

    new_name=$(ls | grep $p | sed 's/:/_/g')        # Using 'sed'
    
                OR
    
    new_name=$(ls | grep $p | tr ':' '_')           # Using 'tr'
    

বোনাস পরিষ্কার :
  ক। যদি অভিন্নতার স্বার্থে আপনি-কলোনগুলি (:) এর সাথে আন্ডারস্কোর (_)দিয়েপ্রতিস্থাপন করতে চান তবে আপনি এটিকরতে পারেন:

    new_name=$(ls | grep $p | tr ':-' '_');

  খ। আপনি যদি সর্বশেষ আন্ডারস্কোরটি চান (ঠিক আগে .txt) ভালভাবে চলে যান তবে new_nameচলকটি সেট করুন :

    new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./')
  1. প্রয়োজন অনুযায়ী এখন আপনার ফাইলটির নাম পরিবর্তন করুন: mv $old_name $new_name

         এনবি: mvপুনর্নবীকরণের ক্রিয়াকলাপের কোনও ফাইলের নাম থাকলে তা ব্যর্থ spacesহবে। সেক্ষেত্রে যথাযথ ভেরিয়েবলগুলি উদ্ধৃতিতে মুছুন, যেমন:
mv "$old_name" $new_name OR mv $old_name "$new_name" OR OR mv "$old_name" "$new_name"


এক-liners,

1a: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | sed 's/:/_/g'); mv $old_name $new_name

1b: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':' '_'); mv $old_name $new_name

2: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_'); mv $old_name $new_name

3: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./'); mv $old_name $new_name

0

ব্যবহার পুনঃনামকারক :

$ renamer --find ":" --replace "-" *

আমি মনে করি কেবলমাত্র ফাইলের নাম পরিবর্তন করার জন্য একটি সম্পূর্ণ নোড.জেএস পরিবেশ স্থাপন করা কিছুটা খুব বেশি। renameএমন একটি সরঞ্জাম যা অনেকগুলি লিনাক্স বিতরণে ইনস্টল করা থাকে। তবে আমি মনে করি উইন্ডোজের জন্য এই সরঞ্জামটি দুর্দান্ত হতে পারে।
noggerl

0

এটি ওভারকিল হতে পারে তবে আপনি এই উত্তরে প্রদত্ত লিঙ্কটিতে স্ক্রিপ্টের সাথে কোনও বিশেষ অক্ষরের নাম পরিবর্তন করতে পারেন:

/superuser//a/858671/365691

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