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


15

দুঃখিত এর অন্য কোথাও যদি উত্তর থাকে তবে আমার সমস্যাটি কীভাবে সন্ধান করবেন তা আমার কোনও ধারণা নেই।

আমি একটি রেডহ্যাট লিনাক্স এইচপিসি সার্ভারে কিছু সিমুলেশন চালাচ্ছিলাম এবং আউটপুটটি সংরক্ষণ করতে ফোল্ডার কাঠামো পরিচালনা করার জন্য আমার কোডটিতে দুর্ভাগ্যজনক বাগ ছিল had ফোল্ডারটি তৈরি করার জন্য আমার মতলব কোডটি ছিল:

folder = [sp.saveLocation, 'run_', sp.run_number, '/'];

যেখানে sp.run_numberএকটি পূর্ণসংখ্যা ছিল আমি এটিকে একটি স্ট্রিংয়ে রূপান্তর করতে ভুলে গিয়েছি, তবে কোনও কারণে চলমান mkdir(folder);(মতলব) এখনও সফল হয়েছে। আসলে, সিমুলেশনগুলি কোনও বাধা ছাড়াই চলে এবং ডেটাটি ম্যাচিং ডিরেক্টরিতে সংরক্ষিত হয়।

এখন, যখন ফোল্ডারটির কাঠামোটি অনুসন্ধান / মুদ্রণ করা হয় আমি নিম্নলিখিত পরিস্থিতিগুলি পাই:

  • আমি যখন স্বয়ংক্রিয়রূপে ট্যাবটি দেওয়ার চেষ্টা করি: run_ run_^A/ run_^B/ run_^C/ run_^D/ run_^E/ run_^F/ run_^G/ run_^H/ run_^I/
  • যখন আমি ব্যবহার ls: run_ run_? run_? run_? run_? run_? run_? run_? run_? run_? run_?
  • আমি যখন আমার ম্যাকের কাছে আরএসসিএনসি ব্যবহার করে --progressঅপশনটি দেখায় তখন: run_\#003/(আমি ধরে নিই) সংখ্যার সাথে sp.run_numberতিন অঙ্কে প্যাডে পূর্ণসংখ্যার সাথে মিলে যায় তাই দশম রান হয়run_\#010/
  • আমি যখন ফাইন্ডারে ফোল্ডারগুলি দেখি তখন দেখি run_ run_ run_ run_ run_ run_ run_ run_ run_ run_?
  • এই প্রশ্নটির দিকে তাকানো এবং ls | LC_ALL=C sed -n lআমি যে আদেশটি পেয়েছি তা ব্যবহার করে :
run_$
run_\001$
run_\002$
run_\003$
run_\004$
run_\005$
run_\006$
run_\a$
run_\b$
run_\t$
run_$

আমি cdএই উপস্থাপনাগুলির কোনও ব্যবহার করে ফোল্ডারগুলিতে পরিচালনা করতে পারি না ।

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


4
"যখন আমি স্বাবলম্বকে ট্যাব দেওয়ার চেষ্টা করি: ... যদি আমি টাইপ করার চেষ্টা করি ..." আপনার পক্ষে যদি স্বতঃপূরণকে কেন টাইপ করুন এবং সম্পূর্ণ হতে দেওয়া হচ্ছে না? এছাড়াও ^Aআক্ষরিক নয় ^দ্বারা অনুসরণ A, কিন্তু জন্য Ctrl-এ (আপনি যেহেতু জন্য Ctrl-এ সাধারণত শেল জন্য একটি শর্টকাট এটা জন্য Ctrl-ভি জন্য Ctrl-এ ব্যবহার টাইপ করতে পারেন)।
মুরু

@ মুরু যে কাজ করে না ... আমি যতদূর যেতে পেরেছি run_এবং আমাকে কিছু টাইপ করতে হবে
ফিল

দুঃখিত, আমি আপনার সম্পাদনা দেখার আগে মন্তব্য করেছিলেন, এটি আমাকে সিডি দিয়ে to
ুকতে


9
বিটিডাব্লু, ম্যাট্লাবের এমকেডির কেন এই "কিছু কারণ" তা হ'ল কারণ ইউনিক্স ফাইল সিস্টেমে কোনও ফাইল বা ডিরেক্টরি নামের কেবলমাত্র অবৈধ অক্ষরগুলি হল NUL এবং ফরোয়ার্ড-স্ল্যাশ /। নিয়ন্ত্রণ অক্ষর সহ অন্য যে কোনও অক্ষর বৈধ। আমি জানি না যে sp.run_number 0 হলে ম্যাটল্যাব কী করত (সম্ভবত হয় ত্রুটি সহ বাতিল বা উত্পাদনের run_কারণ NUL বাইট ডিরেক্টরি নামের স্ট্রিংটি সমাপ্ত করবে)। অবশ্যই, এটি 16-বিট (বা উচ্চতর) মানগুলির ক্ষেত্রেও সমস্যাযুক্ত হবে যার মধ্যে সেগুলির মধ্যে একটি NUL বাইট রয়েছে, এবং ম্যাট্লাব চলমান সিস্টেমের এন্ডিয়ান-নেস অনুসারেও এটি পরিবর্তিত হবে।
সি এ এস

উত্তর:


26

ডিরেক্টরিগুলির নতুন নামকরণের জন্য আপনি পার্ল renameইউটিলিটি (ওরফে prenameবা file-rename) ব্যবহার করতে পারেন ।

দ্রষ্টব্য: এটি অন্য কোনও সংস্করণ renameথেকে বিভ্রান্ত হওয়ার দরকার নেই util-linux

rename -n 's/([[:cntrl:]])/ord($1)/eg' run_*/

এই পার্লের ord()ফাংশনটি ফাইলের প্রতিটি ক্যারেক্টার-অক্ষরকে সেই অক্ষরের অর্ডিনাল সংখ্যার সাথে প্রতিস্থাপন করতে ব্যবহার করে। যেমন ^A1 ^Bহয়ে যায়, 2 হয়, ইত্যাদি।

-nবিকল্প একটি শুষ্ক রানের কি দেখানোর জন্য জন্য rename হবে যদি আপনি এটি দিন না। -vবাস্তবে পুনরায় নামকরণ করতে এটি সরান (বা ভার্বোজ আউটপুট সহ এটি প্রতিস্থাপন করুন )।

eমধ্যে পরিবর্তক s/LHS/RHS/egঅপারেশন কারণ RHS (প্রতিস্থাপন) Perl কোড হিসেবে চালানো Perl, এবং $1LHS থেকে মিলেছে তথ্য (নিয়ন্ত্রণ চরিত্র) হয়।

আপনি যদি ফাইলের নামগুলিতে শূন্য-প্যাডেড নম্বর চান তবে আপনি এর ord()সাথে একত্রিত করতে পারেন sprintf()। যেমন

$ rename -n 's/([[:cntrl:]])/sprintf("%02i",ord($1))/eg' run_*/ | sed -n l
rename(run_\001, run_01)$
rename(run_\002, run_02)$
rename(run_\003, run_03)$
rename(run_\004, run_04)$
rename(run_\005, run_05)$
rename(run_\006, run_06)$
rename(run_\a, run_07)$
rename(run_\b, run_08)$
rename(run_\t, run_09)$

উপরের উদাহরণগুলি যদি কেবলমাত্র sp.run_number আপনার ম্যাটলব স্ক্রিপ্টে 0..26 এর পরিসরে থাকে তবে কাজ করে (তাই এটি ডিরেক্টরিটির নামে নিয়ন্ত্রণ-অক্ষর তৈরি করে)।

যে কোনও 1-বাইট চরিত্রের সাথে ডিল করার জন্য (যেমন 0..255 থেকে) আপনি ব্যবহার করতে চান:

rename -n 's/run_(.)/sprintf("run_%03i",ord($1))/e' run_*/

sp.run_number255> যদি হতে পারে তবে আপনাকে পার্লের unpack()ফাংশনটি ব্যবহার করতে হবে ord()। আমি ঠিক জানি না কীভাবে মাতলাব একটি স্ট্রিংয়ে একটি রূপান্তরিত নাগকে আউটপুট দেয়, তাই আপনাকে পরীক্ষা করতে হবে। দেখুন perldoc -f unpackবিস্তারিত জানার জন্য।

উদাহরণস্বরূপ নিম্নলিখিতটি 8-বিট এবং 16-বিট স্বাক্ষরযুক্ত মান উভয়ই আনপ্যাক করবে এবং শূন্য-প্যাডগুলি তাদের 5 অঙ্কে প্রশস্ত করবে:

 rename -n 's/run_(.*)/sprintf("run_%05i",unpack("SC",$1))/e' run_*/

বিশদ জন্য ধন্যবাদ! আমি -nবিকল্পটি দিয়ে এটি পরীক্ষা করে দেখার চেষ্টা করছি , তবে এটি আমাকে এটি একটি অবৈধ বিকল্প বলছে - সংস্করণ তথ্যটি আমাকে দেয় rename from util-linux 2.23.2যাতে আমি একইরকম ফাংশন সম্পর্কে নিশ্চিত নই
ফিল

3
এজন্য আমি ইউটিলিটির পার্ল সংস্করণ নির্দিষ্ট করেছি renameutil-linuxএর গুলি renameখুব আলাদা, অনেক কম সক্ষম, এবং কমান্ড লাইন বিকল্পগুলি বেমানান। আপনি যদি ডিবিয়ান বা অনুরূপ চালাচ্ছেন তবে file-renameপ্যাকেজটি ইনস্টল করার চেষ্টা করুন । অন্যথায় আপনার ডিস্ট্রোর জন্য উপযুক্ত প্যাকেজ ইনস্টল করুন। এটি ইতিমধ্যে ইনস্টল করা হতে পারে, চালানোর চেষ্টা করুন prenameবা ন্যায়বিচারের file-renameপরিবর্তে rename
কাস

হ্যাঁ আমি ভাবলাম যে ঘটনাটি ছিল। আমি দেখব যে আমি তাদের মধ্যে একজনকে কাজ করতে পারি কিনা। আমাকে সাহায্য করার জন্য সময় দেওয়ার জন্য আবারও ধন্যবাদ!
Phill

11

এবং আমি কৌতূহলের খাতিরে অনুমান করি, হ্যাকের মধ্যে প্রথম স্থানটি কীভাবে হয়েছিল?

folder = [sp.saveLocation, 'run_', sp.run_number, '/'];

যেখানে sp.run_numberএকটি পূর্ণসংখ্যা ছিল আমি এটিকে স্ট্রিংয়ে রূপান্তর করতে ভুলে গিয়েছি, তবে কোনও কারণে চলমান mkdir(folder); (মতলব) এখনও সফল।

সুতরাং, এটি প্রদর্শিত হবে যে mkdir([...])মতলব এ অ্যারের সদস্যদের সাথে ফাইলের নামটি স্ট্রিং হিসাবে তৈরি করতে সম্মতি জানায়। তবে আপনি এটির পরিবর্তে এটি একটি নম্বর দিয়েছেন এবং কম্পিউটারে অক্ষরগুলি আসলে কী। সুতরাং, কখন sp.run_numberছিল 1, এটি আপনাকে মান দিয়ে চরিত্রটি দিয়েছিল 1এবং তারপরে মান সহ চরিত্র 2ইত্যাদি gave

এগুলি নিয়ন্ত্রণের অক্ষর, তাদের মুদ্রণযোগ্য প্রতীক নেই এবং এগুলি টার্মিনালে মুদ্রণের অন্যান্য পরিণতি হতে পারে। সুতরাং পরিবর্তে, তারা প্রায়শই বিভিন্ন ধরণের পলায়ন দ্বারা প্রতিনিধিত্ব করা হয়: \001(অক্টাল), \x01(হেক্স), ^Aমান সহ চরিত্রটির জন্য সমস্ত সাধারণ প্রতিনিধিত্ব 1। মান শূন্য সহ অক্ষরটি কিছুটা পৃথক, এটি NUL বাইট যা সি এবং ইউনিক্স সিস্টেম কলগুলিতে একটি স্ট্রিংয়ের শেষ চিহ্নিত করতে ব্যবহৃত হয়।

আপনি যদি 31 এর বেশি হয়ে যান তবে আপনি মুদ্রণযোগ্য অক্ষরগুলি দেখতে শুরু করতেন, 32 স্থানটি (যদিও খুব বেশি দৃশ্যমান নয়), 33 = !, 34 = "ইত্যাদি

সুতরাং,

  • run_ run_^A/ run_^B/- প্রথমটি run_শূন্য বাইটের সাথে একটির সাথে মিলে যায়, স্ট্রিংটি সেখানেই শেষ হয়। অন্যরা দেখায় যে আপনার শেলটি নিয়ন্ত্রণ কোডগুলি প্রদর্শন করতে ব্যবহার করতে পছন্দ করে ^A। স্বরলিপিটি এও ইঙ্গিত দেয় যে সংখ্যার মান 1 সহ চরটি প্রবেশ করানো যেতে পারে Ctrl-A, যদিও আপনাকে শেলটি নিয়ন্ত্রণ চরিত্র হিসাবে নয়, তবে আক্ষরিক হিসাবে ব্যাখ্যা Ctrl-V Ctrl-Aকরতে হবে, এটি কমপক্ষে বাশে করা উচিত।

  • ls: run_ run_? run_?- lsটার্মিনালে অপ্রিন্টযোগ্য অক্ষরগুলি মুদ্রণ করতে পছন্দ করে না, এটি তাদেরকে প্রশ্ন চিহ্ন দিয়ে প্রতিস্থাপন করে।

  • আরএসসিএনসি: run_\#003/- এটি আমার কাছে নতুন, তবে ধারণাটি একই, ব্যাকস্ল্যাশটি একটি পালানোর চিহ্ন চিহ্নিত করে এবং বাকিটি চরিত্রের সংখ্যাসূচক মান। আমার কাছে মনে হয় যে এখানে সংখ্যাটি আরও বেশি সাধারণের মতো অষ্টালে রয়েছে \003

  • কমান্ডটি ব্যবহার করে ls | LC_ALL=C sed -n l... run_\006$ run_\a$ run_\b$ run_\t$- \a, \bএবং \tসি হ'ল যথাক্রমে অ্যালার্ম (বেল), ব্যাকস্পেস এবং ট্যাবের জন্য। তাদের 7, 8 এবং 9 এর সংখ্যাগত মান রয়েছে, সুতরাং তারা কেন পরে আসে তা স্পষ্ট হওয়া উচিত \006। এই সি এস্কেপগুলি ব্যবহার করা নিয়ন্ত্রণ অক্ষরগুলিকে চিহ্নিত করার আরও একটি উপায়। পেছনের ডলার চিহ্নগুলি চিহ্নিত করে রেখাটি শেষ।

যেমন cdধরে নিচ্ছি, আমার অনুমানগুলি সঠিক, cd run_এটি একটি বিজোড় ট্রেইলিং অক্ষর ছাড়াই একটি একক ডিরেক্টরিতে যাওয়া cd run_?উচিত , এবং একটি চিহ্ন দেওয়া উচিত যেহেতু প্রশ্ন চিহ্নটি কোনও একক অক্ষরের সাথে মেলে এমন এক গ্লোব অক্ষর, এবং একাধিক মিলে যাওয়া ফাইলের নাম রয়েছে তবে cdকেবল একটি আশা

এই বিকল্পগুলির মধ্যে কোনটি ফোল্ডারের সঠিক প্রতিনিধিত্ব?

তারা সবাই এক অর্থে ...

বাশ-এ, আপনি বিশেষ অক্ষরগুলির প্রতিনিধিত্ব করতে উদ্ধৃতিগুলির অভ্যন্তরীণগুলি ব্যবহার করতে পারেন \000এবং \x00পালাতে পারেন $'...', সুতরাং $'run_\033(অষ্টাল) বা $'run_\x1b'অক্ষরের মান 27 (যা ESC হতে পারে) এর সাথে ডিরেক্টরিতে অনুরূপ। (আমি মনে করি না যে বাশ দশমিক সংখ্যা নিয়ে পালাতে সহায়তা করে supports)

ক্যাসের উত্তরে সেগুলির নতুন নামকরণের জন্য একটি স্ক্রিপ্ট রয়েছে, সুতরাং আমি সেখানে যাব না।


যদি এটি জিএনইউ হয় ls, তবে মুদ্রণ-বিহীন অক্ষরগুলি কীভাবে প্রদর্শিত হয় তা নিয়ন্ত্রণ করতে -b/ --escapeএবং --quoting-style=, অথবা QUOTING_STYLEপরিবেশ পরিবর্তনশীল সহ কয়েকটি উদ্ধৃত বিকল্প রয়েছে । যদিও আমি মনে করি না এটি অক্ষরের সংস্করণগুলির তুলনায় অষ্টাল পালাতে পছন্দ করার বিকল্প আছে।
টবি স্পিড

3

সবচেয়ে সহজ হ'ল ভুল পরিবেশনা এবং একই ফাইলের সঠিক ফাইলনামটি একই পরিবেশে যেখানে দুর্ঘটনাটি ঘটেছিল তৈরি করা এবং তারপরে ফোল্ডারগুলিকে সঠিক নামগুলিতে সরিয়ে নেওয়া / পুনরায় নামকরণ করা।

বিদ্যমান নামের মধ্যে সংঘর্ষ এড়াতে আরও একটি গন্তব্য ফোল্ডার ব্যবহার করুন।

./saveLocationA/wrongname1 -> ./saveLocationB/correctname1
./saveLocationA/wrongname2 -> ./saveLocationB/correctname2
./saveLocationA/wrongname3 -> ./saveLocationB/correctname3

যদি সম্ভব হয় তবে আমি স্ক্রিপ্টটি সংশোধন করে আবার এটি চালানো পছন্দ করব; কিছু অদ্ভুত বাগ পোস্ট মর্টেম সংশোধন করতে সম্ভবত আরও বেশি ব্যয় হয় এবং নতুন সমস্যাগুলি প্রবর্তন করতে পারে।

শুভকামনা!

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