পুনরাবৃত্তভাবে সমস্ত অক্ষরের জন্য ডিরেক্টরি তৈরি করুন


12

আমি এমন একটি ডিরেক্টরি তৈরি করতে চাই যাতে আমাকে ডিরেক্টরিগুলি থেকে শুরু aকরে লেবেল করতে হবে z। প্রতিটি ডিরেক্টরির ভিতরে, আমি একটি উপ-ডিরেক্টরির যাতে তারা হিসাবে লেবেলযুক্ত তৈরি করতে হবে aa, abইত্যাদি

সুতরাং, উদাহরণস্বরূপ, ডিরেক্টরিটির জন্য m, আমার সাব ডিরেক্টরিগুলি পর্যন্ত ma, হিসাবে লেবেল করা হবে ।mbmz


3
আপনার প্রথম এমকেডিরের দরকার নেই কারণ -p সাব-ডিরেক্টরিগুলিও তৈরি করছে। এবং আপনি যদি সঠিক পথ ব্যবহার করেন তবে আপনাকে সিডি কমান্ডের প্রয়োজন হবে না। অন্যথায় এটি দুর্দান্ত, কর্মক্ষম, ভেরিয়েবলগুলি ঘোষণা করা ইত্যাদি Michael মাইকেল হোমারের সংস্করণটি আরও কম এবং সম্ভবত আরও ভাল পারফরম্যান্স থাকতে পারে, তবে এই জাতীয় কোনও সাধারণ কাজের জন্য আপনার যথেষ্ট ভাল।

1
আগের দিন এখানে আরও টার্মিনিনফো এন্ট্রি ছিল এবং কোনও বাশ {a..z} সিনট্যাক্স ছিল না তাই আমি [এজে /usr/share/terminfo] দিয়ে তালিকা তৈরি করে সেই আউটপুটটি ব্যবহার করতাম । লিনাক্স সেই গণনায় বেশ বিচ্ছিন্ন, সমস্ত বড় এবং নিম্নতর অক্ষরের পাশাপাশি অঙ্কগুলির জন্য এন্ট্রি ব্যবহৃত হত।
স্কিমেথিংস

উত্তর:


19

চেষ্টা করুন:

for x in {a..z} ; do mkdir -p $x/${x}{a..z} ; done

ব্যাশ প্রসারিত হবে XXX{a..z}আউট XXXa, XXXb, ইত্যাদি। আপনার অভ্যন্তরীণ লুপের দরকার নেই।

তারপর:

$ ls
a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z
$ ls m
ma  mc  me  mg  mi  mk  mm  mo  mq  ms  mu  mw  my
mb  md  mf  mh  mj  ml  mn  mp  mr  mt  mv  mx  mz

7

সুতরাং, bashবর্ণমালা সম্প্রসারণের জিনিসটির সাথে এটি কাজ করে:

set {a..z}
for a do printf "./$a/$a%s\n" "$@"
done | xargs mkdir -p

এবং যদি আপনি প্রথম লাইনে একবার বর্ণমালা টাইপ করেন তবে একই ধারণাটি কোনও শেলের কাছে বহনযোগ্য হতে হবে। আপনি যদি এটি টাইপ করতে না চান তবে সেট লাইনে পৌঁছানোর অন্যান্য উপায় রয়েছে:

seq -sP32P 97 123|dc
a b c d e f g h i j k l m n o p q r s t u v w x y z 

... উদাহরণস্বরূপ একটি ASCII লোকালে কাজ করে। সুতরাং আপনি করতে পারেন set $(seq -sP32P 97 123|dc)বা অন্য কোনও কমান্ড যা $IFSআপনাকে প্রয়োজনীয় আর্গুমেন্টগুলির একটি পৃথক তালিকা পেতে পারে তবে আমার অর্থ, bashজিনিসটি ব্যবহার করা বা এটি টাইপ করা ভাল probably

যাইহোক, আমি মনে করি যে এটি আমি কেবল তখনই করতাম কারণ এটি কেবল যতবার mkdirপ্রয়োজন ততবার আহ্বান করে ।

এবং এটি কীভাবে কাজ করে তা প্রদর্শনের জন্য , এখানে একটি ছোট সেটটির একটি সামান্য ডিবাগ আউটপুট দেওয়া হয়েছে:

sh -cx 'for n do printf "./$n/$n%s\n" "$@"; done|cat' -- arg1 arg2 arg3
+ for n in '"$@"'
+ printf './arg1/arg1%s\n' arg1 arg2 arg3
+ cat
+ for n in '"$@"'
+ printf './arg2/arg2%s\n' arg1 arg2 arg3
+ for n in '"$@"'
+ printf './arg3/arg3%s\n' arg1 arg2 arg3
./arg1/arg1arg1
./arg1/arg1arg2
./arg1/arg1arg3
./arg2/arg2arg1
./arg2/arg2arg2
./arg2/arg2arg3
./arg3/arg3arg1
./arg3/arg3arg2
./arg3/arg3arg3

আপনি দেখতে পাচ্ছেন, forপজিশনাল প্যারামিটার অ্যারে সূচক অনুসারে একবারে কেবল লুপগুলি, যা আমি এখানে বিন্যাসের সময় কেবলমাত্র shপরামিতিগুলি হস্তান্তর করে এবং এর সাথে উপরে সেট করেছি set ${positionals}। তবে printfপ্রতিটি পুনরাবৃত্তির জন্য তার আর্গুমেন্ট তালিকায় একই অ্যারে গ্রহণ করে এবং এর প্রতিটি বিন্যাসে এটির বিন্যাসের স্ট্রিং প্রয়োগ করে, তাই আপনি কোনও অপ্রয়োজনীয় পুনরাবৃত্তি ছাড়াই পুনরাবৃত্তির লক্ষণটি পান get

এবং done|commandউইল যুক্ত করে forপাইপের উপরে লুপের সমস্ত আউটপুট একই done >fileপ্রবাহে প্রবাহিত করে - সমস্ত সম্পূর্ণ for...doneনির্মাণের জন্য কেবল একবার আউটপুট ফাইলটি খোলার এবং বন্ধ করতে ।


3

এখান থেকে , আমি এখানে স্ক্রিপ্ট তৈরি করে শেষ করেছি। তবে, আমি যদি একটি মার্জিত সমাধান পাই তবে আমি এটি উত্তর হিসাবে গ্রহণ করব।

for x in {a..z}
do
    mkdir -p /home/ramesh/$x
    cd /home/ramesh/$x
    for y in {a..z}
    do
        mkdir -p /home/ramesh/$x/$x$y
    done
done

+1, ভাল প্রশ্ন এবং আরও ভাল উত্তর :)
নিডাল

@ নেট ওয়ার্কার, আমি নিশ্চিত যে এটির চেয়ে আরও ভাল সমাধান পাওয়া যায়। কিছু বিশেষজ্ঞের উত্তরের জন্য অপেক্ষা করা যা এই উত্তরটির মতোই কাজটি করবে তবে এতে অনেক শীতল দেখাবে :)
রমেশ

কড়া কথা বলতে গেলে, যখন আপনি জানেন যে পরিবর্তনশীল মানগুলি কী হতে চলেছে (এবং সেগুলি সহজ স্ট্রিং) তখন আপনার প্রয়োজন হয় না তবে আপনার ভেরিয়েবলগুলি উদ্ধৃত করার অভ্যাসে প্রবেশ করা ভাল ধারণা। আপনি ব্যবহার করতে পারেন /home/ramesh/"$x"/"$x$y", /home/ramesh/"$x/$x$y"বা "/home/ramesh/$x/$x$y"- এগুলি সমস্ত সমতুল্য।
স্কট

1

ইন Perl:

perl -MFile::Path=make_path -e '
    make_path(map { $l=$_; map { "$l/$l$_" } a..z } a..z)
'

File::Pathমূল মডিউল থেকে Perl 5.001

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