উইন্ডোজ রেইম কমান্ড কীভাবে ওয়াইল্ডকার্ডকে ব্যাখ্যা করে?


77

উইন্ডোজ রেইম (আরএন) কমান্ড কীভাবে ওয়াইল্ডকার্ডকে ব্যাখ্যা করে?

এইচইএলপি সুবিধাগুলিতে নির্মিত কোনও সহায়ক নয় - এটি ওয়াইল্ডকার্ডগুলিকে মোটেই সম্বোধন করে না।

মাইক্রোসফট TechNet এক্সপি অনলাইন সহায়তা অনেক ভালো নয়। ওয়াইল্ডকার্ড সম্পর্কিত যা বলতে হয় তা এখানে:

"আপনি উভয় ফাইলের নাম প্যারামিটারে ওয়াইল্ডকার্ড ( *এবং ?) ব্যবহার করতে পারেন । আপনি যদি ফাইল নাম 2-এ ওয়াইল্ডকার্ড ব্যবহার করেন, ওয়াইল্ডকার্ডগুলি দ্বারা বর্ণিত অক্ষরগুলি ফাইলের নাম 1 এর সাথে সম্পর্কিত অক্ষরের সাথে সমান হবে" "

খুব বেশি সহায়তা নয় - এমন অনেক উপায়ে রয়েছে যে বিবৃতিটি ব্যাখ্যা করা যায়।

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

যদি আমি কীভাবে ওয়াইল্ডকার্ডগুলি প্রক্রিয়াজাত করা হয় তার বিধিগুলি জানতাম তবে আমি বুঝতে পারি যে প্রায়শই বারে বারে ব্যাচ না করেই আমি RENAME কমান্ডটি আরও কার্যকরভাবে ব্যবহার করতে পারি। অবশ্যই নিয়মগুলি জানার ফলে ব্যাচের বিকাশও উপকৃত হবে।

(হ্যাঁ - এটি এমন একটি ক্ষেত্রে যেখানে আমি একটি যুক্ত প্রশ্ন এবং উত্তর পোস্ট করছি the নিয়মগুলি না জেনে আমি ক্লান্ত হয়ে পড়েছিলাম এবং নিজেই পরীক্ষামূলকভাবে সিদ্ধান্ত নেওয়ার সিদ্ধান্ত নিয়েছি I আমি আবিষ্কার করেছি যে আরও অনেকেই আগ্রহী হতে পারে)


এখানে ওয়াইল্ডকার্ডগুলির সাথে কীভাবে নাম পরিবর্তন করতে হবে তার ভাল উদাহরণ রয়েছে: lagmonster.org/docs/DOS7/z-ren1.html
ম্যাথু লক

5
@ ম্যাথেললক - আকর্ষণীয় লিঙ্ক, তবে এই বিধি এবং উদাহরণগুলি উইন্ডোজ নয় , এমএসডোস for এর জন্য । উল্লেখযোগ্য পার্থক্য রয়েছে। উদাহরণস্বরূপ, এমএসডোস অতিরিক্ত অক্ষর যুক্ত করার পরে *উইন্ডোজ দেয় না। এর বিশাল পরিণতি রয়েছে। আমি যদি সেই সাইটটি সম্পর্কে জানতাম তবে; এটি আমার তদন্তকে আরও সহজ করে দিয়েছে। MSDOS7 বিধিগুলি লং ফাইলের নামের আগে পুরানো ডস নিয়মের তুলনায় উল্লেখযোগ্যভাবে আলাদা এবং উইন্ডোজ কীভাবে এটি পরিচালনা করে তার দিকের একটি পদক্ষেপ। আমি দীর্ঘ দীর্ঘ ফাইলের নাম ডস নিয়মগুলি পেয়েছি এবং সেগুলি আমার তদন্তের জন্য মূল্যহীন।
dbenham

আমি এটি জানতাম না;)
ম্যাথু লক

উত্তর:


116

এই নিয়মগুলি একটি ভিস্তার মেশিনে ব্যাপক পরীক্ষার পরে আবিষ্কার করা হয়েছিল। ফাইলের নামে ইউনিকোড নিয়ে কোনও পরীক্ষা করা হয়নি।

পুনরায় নামকরণের জন্য 2 টি প্যারামিটার প্রয়োজন - একটি উত্সমাস্ক, তার পরে টার্গেটমাস্ক হয়। সোর্সমাস্ক এবং টার্গেটমাস্ক উভয়ই */ এবং ?ওয়াইল্ডকার্ড ধারণ করতে পারে । সোর্স এবং টার্গেট মাস্কের মধ্যে ওয়াইল্ডকার্ডের আচরণ কিছুটা বদলে যায়।

দ্রষ্টব্য - কোনও ফোল্ডারটির নাম পরিবর্তন করতে REN ব্যবহার করা যেতে পারে, তবে ফোল্ডারটির নাম পরিবর্তন করার সময় ওয়াইল্ডকার্ডগুলি সোর্সমাস্ক বা টার্গেটমাস্কে অনুমোদিত নয় । যদি সোর্সমাস্ক কমপক্ষে একটি ফাইলের সাথে মিলে যায় তবে ফাইল (গুলি) পুনরায় নামকরণ করা হবে এবং ফোল্ডারগুলি উপেক্ষা করা হবে। যদি সোর্সমাস্কটি কেবল ফোল্ডারগুলির সাথে মেলে তবে ফাইলগুলি নয়, তবে ওয়াইল্ডকার্ডগুলি উত্স বা লক্ষ্যবস্তুতে উপস্থিত হলে একটি সিনট্যাক্স ত্রুটি তৈরি হয়। যদি সোর্সমাস্ক কোনও কিছুর সাথে মেলে না, তবে "ফাইল পাওয়া যায়নি" ত্রুটির ফলাফল।

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

sourceMask

সোর্সমাস্ক কোন ফাইলের নাম পরিবর্তন করে তা নির্ধারণ করতে ফিল্টার হিসাবে কাজ করে। ওয়াইল্ডকার্ডগুলি এখানে অন্য কোনও কমান্ডের মতোই কাজ করে যা ফাইলের নাম ফিল্টার করে।

  • ?- এই ওয়াইল্ডকার্ড ব্যতীত অন্য কোনও 0 বা 1 টি চরিত্রের সাথে মেলে .- এটি সর্বদা পরবর্তী অক্ষরটি গ্রাস করে যদি এটি না হয় . তবে এটি নামের শেষে থাকলে বা পরবর্তী অক্ষরটি যদি কোনও ব্যর্থতার সাথে মিলবে না.

  • *- (নীচে একটি ব্যতিক্রম সহ . ) সহ যে কোনও 0 বা ততোধিক অক্ষর মেলে । এই ওয়াইল্ডকার্ড লোভী নয়। এটি পরবর্তী অক্ষরগুলির সাথে মেলে সক্ষম করার জন্য যতটা প্রয়োজন সামান্য বা তত বেশি মিলবে।

সমস্ত অ-ওয়াইল্ডকার্ড অক্ষর অবশ্যই নিজের সাথে মেলে, কয়েকটি বিশেষ ক্ষেত্রে ব্যতিক্রম সহ।

  • .- নিজের সাথে মেলে বা কোনও অক্ষর না থেকে থাকলে এটি নামের শেষের সাথে (কিছুই) মিলতে পারে। (দ্রষ্টব্য - একটি বৈধ উইন্ডোজ নাম দিয়ে শেষ করা যাবে না .)

  • {space}- নিজের সাথে মেলে বা কোনও অক্ষর না থেকে থাকলে এটি নামের শেষের সাথে (কিছুই) মিলতে পারে। (দ্রষ্টব্য - একটি বৈধ উইন্ডোজ নাম দিয়ে শেষ করা যাবে না {space})

  • *.শেষে - সাথে মেলে এমন যেকোনো 0 বা তার বেশি অক্ষরের ছাড়া . সসীম .আসলে কোনো সমন্বয় হতে পারে .এবং {space}যতদিন মাস্ক খুব শেষ অক্ষর হিসাবে . এই এক এবং একমাত্র ব্যতিক্রম কোথায় *কেবল অক্ষরের যে কোনও সাথে মিলছে না।

উপরোক্ত নিয়মগুলি এত জটিল নয়। তবে আরও একটি গুরুত্বপূর্ণ নিয়ম রয়েছে যা পরিস্থিতিকে বিভ্রান্ত করে তোলে: সোর্সমাস্ক দীর্ঘ নাম এবং সংক্ষিপ্ত 8.3 নাম উভয়ের সাথে তুলনা করা হয়েছে (যদি তা বিদ্যমান থাকে)। এই শেষ নিয়মটি ফলাফলগুলি খুব জটিল করে তুলতে পারে, কারণ যখন মুখোশটি সংক্ষিপ্ত নামের সাথে মিল থাকে তখন এটি সর্বদা স্পষ্ট হয় না।

এনটিএফএস ভলিউমে সংক্ষিপ্ত 8.3 নাম তৈরি করা নিষ্ক্রিয় করতে RegEdit ব্যবহার করা সম্ভব, যেখানে ফাইল মাস্কের ফলাফলের ব্যাখ্যাটি আরও সোজা হয়ে যায়। সংক্ষিপ্ত নামগুলি অক্ষম করার আগে তৈরি হওয়া যে কোনও সংক্ষিপ্ত নামগুলি রয়ে যাবে।

targetMask

দ্রষ্টব্য - আমি কোনও কঠোর পরীক্ষা করিনি, তবে দেখা যাচ্ছে যে এই একই নিয়মগুলি COPY কমন্ডের টার্গেট নামের জন্যও কাজ করে

টার্গেটম্যাস্ক নতুন নাম নির্দিষ্ট করে। এটি সর্বদা পুরো দীর্ঘ নামে প্রয়োগ করা হয়; উত্সমাস্ক সংক্ষিপ্ত 8.3 নামের সাথে মিলে গেলেও টার্গেটমাস্কটি সংক্ষিপ্ত 8.3 নামের ক্ষেত্রে কখনই প্রয়োগ করা হয় না।

সোর্সমাস্কে ওয়াইল্ডকার্ডের উপস্থিতি বা অনুপস্থিতি টার্গেটমাস্কে ওয়াইল্ডকার্ডগুলি কীভাবে প্রক্রিয়া করা হয় তাতে কোনও প্রভাব নেই।

নিম্নলিখিত আলোচনায় - cকোনো চরিত্র উপস্থাপন করে এমন নয় *, ?অথবা.

টার্গেটমাস্কটি কোনও ব্যাক-ট্র্যাকিং ছাড়াই উত্স নামের বিরুদ্ধে কঠোরভাবে বাম থেকে ডানে প্রক্রিয়া করা হয়।

  • c- পরবর্তী অক্ষরটি না থাকলে .এবং cটার্গেট নামের সাথে যুক্ত হওয়া পর্যন্ত উত্স নামের মধ্যে অবস্থানটি অগ্রসর করে । (যে চরিত্রটি উত্সে ছিল cতা প্রতিস্থাপন করে তবে কখনও প্রতিস্থাপন করে না .)

  • ?- উত্স দীর্ঘ নাম থেকে পরবর্তী অক্ষরটির সাথে মেলে এবং পরবর্তী অক্ষরটি যতক্ষণ না পরবর্তী অক্ষরটি এটি নামের নামের সাথে সংযুক্ত করে . যদি পরবর্তী অক্ষরটি হয় .বা উত্স নামের শেষে থাকে তবে ফলাফল এবং বর্তমানের সাথে কোনও অক্ষর যুক্ত হয় না উত্স নামের মধ্যে অবস্থান অপরিবর্তিত।

  • *টার্গেটমাস্কের শেষে - উত্স থেকে লক্ষ্য পর্যন্ত সমস্ত অক্ষর যুক্ত করে। যদি ইতিমধ্যে উত্স শেষে, তারপর কিছুই না।

  • *c- বর্তমান অবস্থান থেকে সমস্ত উত্স অক্ষরের cসাথে মিলিত হয় (কেস সেনসিটিভ লোভী ম্যাচ) এর শেষ সংঘর্ষের মধ্য দিয়ে এবং লক্ষ্য নামের সাথে অক্ষরের মিলের সেট সংযোজন করে। যদি cখুঁজে পাওয়া যায় না, তবে উত্স থেকে সমস্ত অক্ষর যুক্ত করা হবে, তারপরে c এটিই আমি একমাত্র পরিস্থিতি সম্পর্কে জানলাম যেখানে উইন্ডোজ ফাইলের প্যাটার্নের মিলটি কেস সংবেদনশীল।

  • *.- বর্তমান অবস্থান থেকে সমস্ত উত্স অক্ষরের সাথে মিলিত করে (লোভী ম্যাচ) এর শেষ সংঘর্ষের মধ্য দিয়ে .এবং লক্ষ্য নামের সাথে অক্ষরের মিলের সেট সংযোজন করে। যদি .খুঁজে পাওয়া যায় না, তবে উত্স থেকে সমস্ত অক্ষর যুক্ত করা হবে, তারপরে অনুসরণ করা হবে.

  • *?- উত্স থেকে লক্ষ্য পর্যন্ত সমস্ত অক্ষর যুক্ত করে। যদি ইতিমধ্যে উত্স শেষে হয় তবে কিছুই করে না।

  • .ছাড়া *ফ্রন্ট - মাধ্যমে উৎস অবস্থান ক্ষেত্রে ঋণ প্রথম এর occurance .যে কোন অক্ষর অনুলিপি ছাড়া আর appends .লক্ষ্য নাম। যদি .উত্সটি খুঁজে পাওয়া যায় না, তবে উত্সের শেষ দিকে অগ্রসর হয় এবং .লক্ষ্য নামের সাথে যুক্ত হয়।

টার্গেটম্যাস্ক শেষ হয়ে যাওয়ার পরে, কোনও পিছনে .এবং {space}ফলাফলের টার্গেটের নামের শেষে ছাঁটাই করা হয় কারণ উইন্ডোজ ফাইলের নামগুলি .বা এর সাথে শেষ হতে পারে না{space}

কিছু ব্যবহারিক উদাহরণ

যে কোনও এক্সটেনশনের আগে 1 ম এবং 3 য় পজিশনে একটি অক্ষর প্রতিস্থাপন করুন (এটি এখনও উপস্থিত না থাকলে 2 য় বা 3 য় অক্ষর যুক্ত করুন)

ren  *  A?Z*
  1        -> AZ
  12       -> A2Z
  1.txt    -> AZ.txt
  12.txt   -> A2Z.txt
  123      -> A2Z
  123.txt  -> A2Z.txt
  1234     -> A2Z4
  1234.txt -> A2Z4.txt

প্রতিটি ফাইলের (চূড়ান্ত) এক্সটেনশন পরিবর্তন করুন

ren  *  *.txt
  a     -> a.txt
  b.dat -> b.txt
  c.x.y -> c.x.txt

প্রতিটি ফাইলে একটি এক্সটেনশন যুক্ত করুন

ren  *  *?.bak
  a     -> a.bak
  b.dat -> b.dat.bak
  c.x.y -> c.x.y.bak

প্রাথমিক এক্সটেনশনের পরে কোনও অতিরিক্ত এক্সটেনশন সরান। নোট করুন যে ?পুরো বিদ্যমান নাম এবং প্রাথমিক এক্সটেনশন সংরক্ষণের জন্য পর্যাপ্ত ব্যবহার করতে হবে।

ren  *  ?????.?????
  a     -> a
  a.b   -> a.b
  a.b.c -> a.b
  part1.part2.part3    -> part1.part2
  123456.123456.123456 -> 12345.12345   (note truncated name and extension because not enough `?` were used)

উপরের মতো একই, তবে প্রাথমিক নাম এবং / অথবা 5 টি অক্ষরের চেয়ে বেশি এক্সটেনশানযুক্ত ফাইলগুলি ফিল্টার করুন যাতে সেগুলি কেটে না যায়। (স্পষ্টতই ?ছয় অক্ষরের দীর্ঘ পর্যন্ত নাম এবং এক্সটেনশনগুলি সংরক্ষণ করতে টার্গেটম্যাস্কের উভয় প্রান্তে একটি অতিরিক্ত যোগ করতে পারে )

ren  ?????.?????.*  ?????.?????
  a      ->  a
  a.b    ->  a.b
  a.b.c  ->  a.b
  part1.part2.part3  ->  part1.part2
  123456.123456.123456  (Not renamed because doesn't match sourceMask)

_নামের শেষে অক্ষর পরিবর্তন করুন এবং এক্সটেনশন সংরক্ষণের চেষ্টা করুন। ( _এক্সটেনশনে উপস্থিত হলে সঠিকভাবে কাজ করে না )

ren  *_*  *_NEW.*
  abcd_12345.txt  ->  abcd_NEW.txt
  abc_newt_1.dat  ->  abc_newt_NEW.dat
  abcdef.jpg          (Not renamed because doesn't match sourceMask)
  abcd_123.a_b    ->  abcd_123.a_NEW  (not desired, but no simple RENAME form will work in this case)

. অক্ষর দ্বারা সীমিত যে কোনও নামই ভাঙতে পারে কেবল প্রতিটি উপাদানটির শেষে থেকে যুক্ত বা মুছতে পারে। ওয়াইল্ডকার্ডের সাহায্যে বাকী অংশ সংরক্ষণ করার সময় অক্ষরের শুরু বা মাঝখানে অক্ষর মুছতে বা যোগ করা যায় না। বিকল্প কোথাও অনুমোদিত হয়।

ren  ??????.??????.??????  ?x.????999.*rForTheCourse
  part1.part2            ->  px.part999.rForTheCourse
  part1.part2.part3      ->  px.part999.parForTheCourse
  part1.part2.part3.part4   (Not renamed because doesn't match sourceMask)
  a.b.c                  ->  ax.b999.crForTheCourse
  a.b.CarPart3BEER       ->  ax.b999.CarParForTheCourse

যদি সংক্ষিপ্ত নামগুলি সক্ষম করা থাকে, তবে ?নামের জন্য কমপক্ষে 8 এবং ?এক্সটেনশনের জন্য কমপক্ষে 3 সহ একটি সোর্সমাস্ক সমস্ত ফাইলের সাথে মিলবে কারণ এটি সর্বদা সংক্ষিপ্ত 8.3 নামের সাথে মেলে।

ren ????????.???  ?x.????999.*rForTheCourse
  part1.part2.part3.part4  ->  px.part999.part3.parForTheCourse


দরকারী কৌতুক / বাগ? নাম উপসর্গ মুছে ফেলার জন্য

এই সুপার ইউজার পোস্টটি বর্ণনা করে যে কীভাবে /কোনও ফাইলের নাম থেকে শীর্ষস্থানীয় অক্ষরগুলি মুছতে ফরোয়ার্ড স্ল্যাশগুলির সেট ( ) ব্যবহার করা যেতে পারে। প্রতিটি অক্ষর মুছে ফেলার জন্য একটি স্ল্যাশ প্রয়োজন। আমি একটি উইন্ডোজ 10 মেশিনে আচরণটি নিশ্চিত করেছি।

ren "abc-*.txt" "////*.txt"
  abc-123.txt        --> 123.txt
  abc-HelloWorld.txt --> HelloWorld.txt

এই কৌশলটি কেবল তখনই কাজ করে যদি উত্স এবং টার্গেট মাস্ক উভয়ই ডাবল উদ্ধৃতিতে আবদ্ধ থাকে। প্রয়োজনীয় উদ্ধৃতি ব্যতীত নিম্নলিখিত সমস্ত ফর্মগুলি এই ত্রুটির সাথে ব্যর্থ হয়:The syntax of the command is incorrect

REM - All of these forms fail with a syntax error.
ren abc-*.txt "////*.txt"
ren "abc-*.txt" ////*.txt
ren abc-*.txt ////*.txt

/মধ্যম অথবা একটি ফাইল নামের শেষ যে কোন অক্ষর মুছে ফেলার জন্য ব্যবহার করা যাবে না। এটি কেবল শীর্ষস্থানীয় (উপসর্গ) অক্ষরগুলি সরাতে পারে।

প্রযুক্তিগতভাবে /ওয়াইল্ডকার্ড হিসাবে কাজ করছে না। বরং এটি একটি সরল চরিত্রের প্রতিস্থাপন করছে, তবে তারপরে প্রতিস্থাপনের পরে, আরএন কমান্ডটি /কোনও ফাইলের নামে বৈধ নয় তা সনাক্ত করে এবং /নামটি থেকে শীর্ষস্থানীয় স্ল্যাশগুলি কেড়ে নেয়। REN যদি /একটি লক্ষ্য নামের মাঝখানে সনাক্ত করে তবে একটি সিনট্যাক্স ত্রুটি দেয় ।


সম্ভাব্য পুনরায় নাম বাগ - একটি একক কমান্ড একই ফাইলটির পুনরায় নাম পরিবর্তন করতে পারে!

একটি খালি পরীক্ষা ফোল্ডারে শুরু হচ্ছে:

C:\test>copy nul 123456789.123
        1 file(s) copied.

C:\test>dir /x
 Volume in drive C is OS
 Volume Serial Number is EE2C-5A11

 Directory of C:\test

09/15/2012  07:42 PM    <DIR>                       .
09/15/2012  07:42 PM    <DIR>                       ..
09/15/2012  07:42 PM                 0 123456~1.123 123456789.123
               1 File(s)              0 bytes
               2 Dir(s)  327,237,562,368 bytes free

C:\test>ren *1* 2*3.?x

C:\test>dir /x
 Volume in drive C is OS
 Volume Serial Number is EE2C-5A11

 Directory of C:\test

09/15/2012  07:42 PM    <DIR>                       .
09/15/2012  07:42 PM    <DIR>                       ..
09/15/2012  07:42 PM                 0 223456~1.XX  223456789.123.xx
               1 File(s)              0 bytes
               2 Dir(s)  327,237,562,368 bytes free

REM Expected result = 223456789.123.x

আমি বিশ্বাস করি উত্সমাস্কটি *1*দীর্ঘ ফাইলের নামের সাথে প্রথমে মেলে এবং ফাইলটির প্রত্যাশিত ফলাফলটির নাম পরিবর্তন করা হয়েছে 223456789.123.x। পুনরায় নামকরণ প্রক্রিয়া করার জন্য আরও ফাইলগুলির সন্ধান করতে থাকে এবং এর নতুন সংক্ষিপ্ত নামের মাধ্যমে নতুন নামকৃত ফাইলটি সন্ধান করে 223456~1.X। এরপরে ফাইলটির পুনরায় নামকরণ করা হয় এর চূড়ান্ত ফলাফল 223456789.123.xx

যদি আমি 8.3 নাম প্রজন্মটি অক্ষম করে রাখি তবে RENAME প্রত্যাশিত ফলাফল দেয়।

এই বিজোড় আচরণকে প্ররোচিত করার জন্য আমি অবশ্যই সমস্ত ট্রিগার অবস্থার সম্পূর্ণ কাজ করিনি। আমি উদ্বিগ্ন ছিলাম যে কখনই শেষ না হওয়া পুনরাবৃত্তি হওয়া RENAME তৈরি করা সম্ভব হতে পারে তবে আমি কখনই এটিকে প্ররোচিত করতে সক্ষম হইনি।

আমি বিশ্বাস করি বাগটি প্ররোচিত করার জন্য নিম্নলিখিত সমস্ত কিছু অবশ্যই সত্য be প্রতিটি বুগড কেস আমি দেখেছি নিম্নলিখিত শর্ত ছিল, কিন্তু নিম্নলিখিত শর্তাবলী পূরণ করে যে সমস্ত ক্ষেত্রে bugged ছিল না।

  • সংক্ষিপ্ত 8.3 নাম অবশ্যই সক্ষম করতে হবে
  • সোর্সমাস্ক অবশ্যই মূল দীর্ঘ নামের সাথে মেলে।
  • প্রাথমিক নামটিতে অবশ্যই একটি সংক্ষিপ্ত নাম তৈরি করতে হবে যা উত্সমাস্কের সাথেও মেলে
  • প্রাথমিক নাম পরিবর্তন করা ছোট নামটির মূল সংক্ষিপ্ত নামের পরে বাছাই করতে হবে (যদি তা বিদ্যমান থাকে?)

6
কি পুরো উত্তর .. +1।
মধ্যস্বত্বভোগী ওমরালিভিভ

তীব্রভাবে বিস্তারিত!
অ্যান্ড্রি এম

13
এর ভিত্তিতে, মাইক্রোসফ্টকে কেবল "ব্যবহারের জন্য, সুপারuser.com/a/475875 " এ যুক্ত করা উচিত REN /?
ইফোটিনিস

4
@ ক্যাড - এই উত্তরটি 100% মূল সামগ্রী যা আমার অনুরোধের ভিত্তিতে সাইমন তার সাইটে অন্তর্ভুক্ত করেছিল। সেই এসএস 64 পৃষ্ঠার নীচে তাকান এবং আপনি দেখতে পাবেন যে সাইমন আমাকে কাজের জন্য কৃতিত্ব দেয়।
dbenham

2
@ জ্যাকসনএফএফরে - আমার উত্তরটিতে নতুন তথ্য / কৌশল যুক্ত হয়েছে। Copy of অস্পষ্ট ফরোয়ার্ড স্ল্যাশ কৌশলটি ব্যবহার করে আপনি আসলে আপনার উপসর্গটি মুছতে পারেন :ren "Copy of *.txt" "////////*"
dbenham

4

এক্সবুকের অনুরূপ, উত্স ফাইল থেকে লক্ষ্য ফাইলের নাম পেতে এখানে একটি # # বাস্তবায়ন রয়েছে।

আমি ডেনহ্যামের উদাহরণগুলিতে 1 টি ছোট ত্রুটি পেয়েছি:

 ren  *_*  *_NEW.*
   abc_newt_1.dat  ->  abc_newt_NEW.txt (should be: abd_newt_NEW.dat)

কোডটি এখানে:

    /// <summary>
    /// Returns a filename based on the sourcefile and the targetMask, as used in the second argument in rename/copy operations.
    /// targetMask may contain wildcards (* and ?).
    /// 
    /// This follows the rules of: http://superuser.com/questions/475874/how-does-the-windows-rename-command-interpret-wildcards
    /// </summary>
    /// <param name="sourcefile">filename to change to target without wildcards</param>
    /// <param name="targetMask">mask with wildcards</param>
    /// <returns>a valid target filename given sourcefile and targetMask</returns>
    public static string GetTargetFileName(string sourcefile, string targetMask)
    {
        if (string.IsNullOrEmpty(sourcefile))
            throw new ArgumentNullException("sourcefile");

        if (string.IsNullOrEmpty(targetMask))
            throw new ArgumentNullException("targetMask");

        if (sourcefile.Contains('*') || sourcefile.Contains('?'))
            throw new ArgumentException("sourcefile cannot contain wildcards");

        // no wildcards: return complete mask as file
        if (!targetMask.Contains('*') && !targetMask.Contains('?'))
            return targetMask;

        var maskReader = new StringReader(targetMask);
        var sourceReader = new StringReader(sourcefile);
        var targetBuilder = new StringBuilder();


        while (maskReader.Peek() != -1)
        {

            int current = maskReader.Read();
            int sourcePeek = sourceReader.Peek();
            switch (current)
            {
                case '*':
                    int next = maskReader.Read();
                    switch (next)
                    {
                        case -1:
                        case '?':
                            // Append all remaining characters from sourcefile
                            targetBuilder.Append(sourceReader.ReadToEnd());
                            break;
                        default:
                            // Read source until the last occurrance of 'next'.
                            // We cannot seek in the StringReader, so we will create a new StringReader if needed
                            string sourceTail = sourceReader.ReadToEnd();
                            int lastIndexOf = sourceTail.LastIndexOf((char) next);
                            // If not found, append everything and the 'next' char
                            if (lastIndexOf == -1)
                            {
                                targetBuilder.Append(sourceTail);
                                targetBuilder.Append((char) next);

                            }
                            else
                            {
                                string toAppend = sourceTail.Substring(0, lastIndexOf + 1);
                                string rest = sourceTail.Substring(lastIndexOf + 1);
                                sourceReader.Dispose();
                                // go on with the rest...
                                sourceReader = new StringReader(rest);
                                targetBuilder.Append(toAppend);
                            }
                            break;
                    }

                    break;
                case '?':
                    if (sourcePeek != -1 && sourcePeek != '.')
                    {
                        targetBuilder.Append((char)sourceReader.Read());
                    }
                    break;
                case '.':
                    // eat all characters until the dot is found
                    while (sourcePeek != -1 && sourcePeek != '.')
                    {
                        sourceReader.Read();
                        sourcePeek = sourceReader.Peek();
                    }

                    targetBuilder.Append('.');
                    // need to eat the . when we peeked it
                    if (sourcePeek == '.')
                        sourceReader.Read();

                    break;
                default:
                    if (sourcePeek != '.') sourceReader.Read(); // also consume the source's char if not .
                    targetBuilder.Append((char)current);
                    break;
            }

        }

        sourceReader.Dispose();
        maskReader.Dispose();
        return targetBuilder.ToString().TrimEnd('.', ' ');
    }

এবং উদাহরণগুলি পরীক্ষা করার জন্য এখানে একটি নুনিট পরীক্ষা পদ্ধতি রয়েছে:

    [Test]
    public void TestGetTargetFileName()
    {
        string targetMask = "?????.?????";
        Assert.AreEqual("a", FileUtil.GetTargetFileName("a", targetMask));
        Assert.AreEqual("a.b", FileUtil.GetTargetFileName("a.b", targetMask));
        Assert.AreEqual("a.b", FileUtil.GetTargetFileName("a.b.c", targetMask));
        Assert.AreEqual("part1.part2", FileUtil.GetTargetFileName("part1.part2.part3", targetMask));
        Assert.AreEqual("12345.12345", FileUtil.GetTargetFileName("123456.123456.123456", targetMask));

        targetMask = "A?Z*";
        Assert.AreEqual("AZ", FileUtil.GetTargetFileName("1", targetMask));
        Assert.AreEqual("A2Z", FileUtil.GetTargetFileName("12", targetMask));
        Assert.AreEqual("AZ.txt", FileUtil.GetTargetFileName("1.txt", targetMask));
        Assert.AreEqual("A2Z.txt", FileUtil.GetTargetFileName("12.txt", targetMask));
        Assert.AreEqual("A2Z", FileUtil.GetTargetFileName("123", targetMask));
        Assert.AreEqual("A2Z.txt", FileUtil.GetTargetFileName("123.txt", targetMask));
        Assert.AreEqual("A2Z4", FileUtil.GetTargetFileName("1234", targetMask));
        Assert.AreEqual("A2Z4.txt", FileUtil.GetTargetFileName("1234.txt", targetMask));

        targetMask = "*.txt";
        Assert.AreEqual("a.txt", FileUtil.GetTargetFileName("a", targetMask));
        Assert.AreEqual("b.txt", FileUtil.GetTargetFileName("b.dat", targetMask));
        Assert.AreEqual("c.x.txt", FileUtil.GetTargetFileName("c.x.y", targetMask));

        targetMask = "*?.bak";
        Assert.AreEqual("a.bak", FileUtil.GetTargetFileName("a", targetMask));
        Assert.AreEqual("b.dat.bak", FileUtil.GetTargetFileName("b.dat", targetMask));
        Assert.AreEqual("c.x.y.bak", FileUtil.GetTargetFileName("c.x.y", targetMask));

        targetMask = "*_NEW.*";
        Assert.AreEqual("abcd_NEW.txt", FileUtil.GetTargetFileName("abcd_12345.txt", targetMask));
        Assert.AreEqual("abc_newt_NEW.dat", FileUtil.GetTargetFileName("abc_newt_1.dat", targetMask));
        Assert.AreEqual("abcd_123.a_NEW", FileUtil.GetTargetFileName("abcd_123.a_b", targetMask));

        targetMask = "?x.????999.*rForTheCourse";

        Assert.AreEqual("px.part999.rForTheCourse", FileUtil.GetTargetFileName("part1.part2", targetMask));
        Assert.AreEqual("px.part999.parForTheCourse", FileUtil.GetTargetFileName("part1.part2.part3", targetMask));
        Assert.AreEqual("ax.b999.crForTheCourse", FileUtil.GetTargetFileName("a.b.c", targetMask));
        Assert.AreEqual("ax.b999.CarParForTheCourse", FileUtil.GetTargetFileName("a.b.CarPart3BEER", targetMask));

    }

আমার উদাহরণে ভুল সম্পর্কে মাথা আপ করার জন্য ধন্যবাদ। আমি আমার উত্তরটি এটি ঠিক করার জন্য সম্পাদনা করেছি।
dbenham

1

কেউ এই দরকারী খুঁজে পেতে পারেন। এই জাভাস্ক্রিপ্ট কোড উপরের dbenham উত্তর উপর ভিত্তি করে।

আমি sourceMaskখুব বেশি পরীক্ষা করিনি , তবে targetMaskডেনহ্যামের দেওয়া সমস্ত উদাহরণের সাথে মেলে।

function maskMatch(path, mask) {
    mask = mask.replace(/\./g, '\\.')
    mask = mask.replace(/\?/g, '.')
    mask = mask.replace(/\*/g, '.+?')
    var r = new RegExp('^'+mask+'$', '')
    return path.match(r)
}

function maskNewName(path, mask) {
    if (path == '') return
    var x = 0, R = ''
    for (var m = 0; m < mask.length; m++) {
        var ch = mask[m], q = path[x], z = mask[m + 1]
        if (ch != '.' && ch != '*' && ch != '?') {
            if (q && q != '.') x++
            R += ch
        } else if (ch == '?') {
            if (q && q != '.') R += q, x++
        } else if (ch == '*' && m == mask.length - 1) {
            while (x < path.length) R += path[x++]
        } else if (ch == '*') {
            if (z == '.') {
                for (var i = path.length - 1; i >= 0; i--) if (path[i] == '.') break
                if (i < 0) {
                    R += path.substr(x, path.length) + '.'
                    i = path.length
                } else R += path.substr(x, i - x + 1)
                x = i + 1, m++
            } else if (z == '?') {
                R += path.substr(x, path.length), m++, x = path.length
            } else {
                for (var i = path.length - 1; i >= 0; i--) if (path[i] == z) break
                if (i < 0) R += path.substr(x, path.length) + z, x = path.length, m++
                else R += path.substr(x, i - x), x = i + 1
            }
        } else if (ch == '.') {
            while (x < path.length) if (path[x++] == '.') break
            R += '.'
        }
    }
    while (R[R.length - 1] == '.') R = R.substr(0, R.length - 1)
}

0

আমি ওয়াইল্ডকার্ড ফাইলের নামগুলি মাস্ক করতে বেসিক এ এই কোডটি লিখতে পরিচালিত করেছি:

REM inputs a filename and matches wildcards returning masked output filename.
FUNCTION maskNewName$ (path$, mask$)
IF path$ = "" THEN EXIT FUNCTION
IF INSTR(path$, "?") OR INSTR(path$, "*") THEN EXIT FUNCTION
x = 0
R$ = ""
FOR m = 0 TO LEN(mask$) - 1
    ch$ = MID$(mask$, m + 1, 1)
    q$ = MID$(path$, x + 1, 1)
    z$ = MID$(mask$, m + 2, 1)
    IF ch$ <> "." AND ch$ <> "*" AND ch$ <> "?" THEN
        IF LEN(q$) AND q$ <> "." THEN x = x + 1
        R$ = R$ + ch$
    ELSE
        IF ch$ = "?" THEN
            IF LEN(q$) AND q$ <> "." THEN R$ = R$ + q$: x = x + 1
        ELSE
            IF ch$ = "*" AND m = LEN(mask$) - 1 THEN
                WHILE x < LEN(path$)
                    R$ = R$ + MID$(path$, x + 1, 1)
                    x = x + 1
                WEND
            ELSE
                IF ch$ = "*" THEN
                    IF z$ = "." THEN
                        FOR i = LEN(path$) - 1 TO 0 STEP -1
                            IF MID$(path$, i + 1, 1) = "." THEN EXIT FOR
                        NEXT
                        IF i < 0 THEN
                            R$ = R$ + MID$(path$, x + 1) + "."
                            i = LEN(path$)
                        ELSE
                            R$ = R$ + MID$(path$, x + 1, i - x + 1)
                        END IF
                        x = i + 1
                        m = m + 1
                    ELSE
                        IF z$ = "?" THEN
                            R$ = R$ + MID$(path$, x + 1, LEN(path$))
                            m = m + 1
                            x = LEN(path$)
                        ELSE
                            FOR i = LEN(path$) - 1 TO 0 STEP -1
                                'IF MID$(path$, i + 1, 1) = z$ THEN EXIT FOR
                                IF UCASE$(MID$(path$, i + 1, 1)) = UCASE$(z$) THEN EXIT FOR
                            NEXT
                            IF i < 0 THEN
                                R$ = R$ + MID$(path$, x + 1, LEN(path$)) + z$
                                x = LEN(path$)
                                m = m + 1
                            ELSE
                                R$ = R$ + MID$(path$, x + 1, i - x)
                                x = i + 1
                            END IF
                        END IF
                    END IF
                ELSE
                    IF ch$ = "." THEN
                        DO WHILE x < LEN(path$)
                            IF MID$(path$, x + 1, 1) = "." THEN
                                x = x + 1
                                EXIT DO
                            END IF
                            x = x + 1
                        LOOP
                        R$ = R$ + "."
                    END IF
                END IF
            END IF
        END IF
    END IF
NEXT
DO WHILE RIGHT$(R$, 1) = "."
    R$ = LEFT$(R$, LEN(R$) - 1)
LOOP
R$ = RTRIM$(R$)
maskNewName$ = R$
END FUNCTION

4
আপনি কী ব্যাখ্যা করতে পারেন যে এই প্রশ্নের উত্তরটিতে কী জিজ্ঞাসা করা হয়েছিল?
ফিক্সার 1234

এটি REN ওয়াইল্ডকার্ড ম্যাচের জন্য REN * .TMP * .DOC প্রসেসিংয়ের মতো ব্যবহারের ফাংশনটির অনুলিপি করে যা ফাইলের নাম পরিবর্তন করার আগে ফাংশনটি কীভাবে ডাকা হয় তার উপর নির্ভর করে।
eoredson
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.