Mkdir ব্যবহার করে অসংখ্য ডিরেক্টরি তৈরি করা হচ্ছে


15

আমি অনেকগুলি ডিরেক্টরি ব্যবহার করে তৈরি করতে চাই mkdir। প্রতিটি ডিরেক্টরি নামের একটি উপসর্গ (একটি স্ট্রিং) এবং একটি সূচক (একটি পূর্ণসংখ্যা) সমন্বিত থাকবে। মনে করুন যে আমি উপসর্গটি "s" হতে চাই এবং সূচকগুলি 1 থেকে 50 এর মধ্যে হতে হবে This এর অর্থ হল যে আমি শিরোনামে ডিরেক্টরি তৈরি করতে চাই:

s1,, s2... s49,,s50

এটি স্বয়ংক্রিয়ভাবে ব্যবহার করার কোনও উপায় আছে mkdir? আপনার সময় জন্য ধন্যবাদ।


2
আপনি কোন শেল ব্যবহার করছেন?
ফ্রান্সেসকো টার্কো

@FrancescoTurco আমি ব্যবহার করছি bash। সময় দেয়ার জন্য ধন্যবাদ!
অ্যান্ড্রু

3
অবগতির জন্য, আমি এটা খুঁজে অনেক আরো উপযোগী, স্থায়ী-প্রস্থের সূচকের ব্যবহার করতে চান: s01, s02, ..., s49, s50। যদি আমি স্থির-প্রস্থ সূচকগুলি ব্যবহার করি তবে /bin/lsপ্রায়শই আমার পছন্দ অনুযায়ী ক্রম উত্পাদন করে।
রব

উত্তর:


33

আপনি এটি শেল স্ক্রিপ্ট দিয়ে করতে পারেন।

খাঁটি sh - এটি প্রাক-পসিক্স বোর্ন শেলগুলিতেও কাজ করবে:

n=1;
max=50;
while [ "$n" -le "$max" ]; do
  mkdir "s$n"
  n=`expr "$n" + 1`;
done

আপনি যদি একটি উচ্চ সংখ্যক ডিরেক্টরি তৈরি করতে চান তবে আপনি স্ক্রিপ্টটি একক কলে হ্রাস করার mkdirপাশাপাশি পরীক্ষার এবং পাটিগণিতের জন্য শেল বিল্টিন ব্যবহার করে দ্রুত তৈরি করতে পারেন । এটার মত:

n=1
max=50
set -- # this sets $@ [the argv array] to an empty list.

while [ "$n" -le "$max" ]; do
    set -- "$@" "s$n" # this adds s$n to the end of $@
    n=$(( $n + 1 ));
done 

mkdir "$@"

Zsh, ksh93 বা ব্যাশ এটিকে আরও সহজ করে তোলে তবে আমার এটি উল্লেখ করা উচিত যে এটি অন্তর্নির্মিত mkdirনয় এবং অন্য শেলগুলিতে কাজ নাও করতে পারে। বৃহত্তর ক্ষেত্রে, এটি কোনও কমান্ডে যেতে পারে এমন আর্গুমেন্টের সংখ্যা বা মোট আকারের সীমা দ্বারাও প্রভাবিত হতে পারে।

mkdir s{1..50}

3
+1 এটি দুর্দান্ত! আমি একটি জিনিস সম্পর্কে নিটপিক করব, যদিও: n=$(( n + 1 ))ঠিক যেমন কঠোরভাবে পসিক্স হত এবং আপনাকে কোনও সাবস্কেল খরচ করতে হত না।
কোজিরো

@ রহমু [[কীওয়ার্ডটি পসিক্স নয়। ( এটি অনেক আধুনিক শেলের মধ্যে একটি খোল নির্মিত [ বলে উল্লেখ করা যায় না))
কোজিরো

@ কোজিরো: [[আমার ksh88(যা পূর্বে bash) কাজ করে তাই আমি ধরে নিলাম এটি পসিএক্স was আমি পসিক্স স্পেক্সে এর কোনও উল্লেখ পাইনি তাই আমি বিশ্বাস করি যে আপনি ঠিক বলেছেন। তথ্যের জন্য ধন্যবাদ!
রাহমু

আমি পাটিগণিতের বিস্তৃতি ব্যবহার করে কোনও সংস্করণ যুক্ত করার কথা ভেবেছিলাম, তবে প্রাক-পসিক্স সংস্করণেও কাজ করে এমন স্টাফগুলিতে "খাঁটি sh" সীমাবদ্ধ রাখতে চেয়েছিলাম। আমি একই কারণে সেকের কথাও উল্লেখ করিনি - আপনার যদি সেক থাকে তবে আপনার সম্ভবত বাশ আছে। লুপ উদাহরণটি বৃহত সংখ্যক ডিরেক্টরিগুলির জন্য আর্গুমেন্ট সীমা বাইপাস করার জন্যও ভাল, যার অর্থ এটিও for i in {range}উন্নত শেলগুলির ব্যবহারকারীদের জন্য একটি জায়গা ।
র্যান্ডম 832

শেষের দিকে zsh ইঙ্গিতটি আশ্চর্যজনক, এটি আমার এত সময় বাঁচিয়েছিল!
জেস

33
  • এক

    for i in {1..50}; do
      mkdir s"$i"
    done
    
  • দুই

    mkdir s{1..50}

    এই বিকল্পটি ব্যাশ , zsh এবং ksh93 এ কাজ করে

  • তিন

    mkdir $(printf "s%02i " $(seq 1 50))

4
কেন আপনি কখনই দু'জনের ওপরে ব্যবহার করবেন?
কেভিন

7
আপনি $iকেবল উদাহরণ তৈরির চেয়ে আরও কিছু করতে চাইতে পারেন mkdir s$i ; echo $i > s$i/$i। এছাড়াও, ব্যাশের জন্য লুপের ব্যবহারের একটি দুর্দান্ত, সাধারণ উদাহরণ ... এর মতো সাইটে এটি কোনও নবজাতক ব্যবহারকারীর এটি দেখার এবং এটি "ভাবতে ভাল লাগবে না", আমি বুঝতে পারিনি যে আপনি এটি করতে পারেন "---> আলোকায়ন।
কেস

1
@ আরহামু এটি বাশ / জেডএসে সম্ভবত পাওয়া যাবে (সম্ভবত ksh93) feature ডাউনভোট করার দরকার নেই।
সহায়ক

3
@ রহমু: আমি মনে করি যে ঝোনাথনের উত্তর অপরিহার্যভাবে অন্যদের সাথে নয়, ওপি'র শেল (বাশ) দিয়ে সমস্যার সমাধান করে তবেই আমাদের বিবেচনা করা উচিত।
ফ্রান্সেস্কো টার্কো

4
@ কেভিন যদিও পঞ্চাশের জন্য এটি কোনও সমস্যা হওয়ার সম্ভাবনা নেই, আপনি যদি পাঁচশো ডিরেক্টরি পেয়ে থাকেন তবে আপনাকে যুক্তি সীমা সম্পর্কে চিন্তিত করতে হবে।
র্যান্ডম 832

10

এখানে অনেক জটিল উত্তর, কিন্তু ব্যাশ এটি সত্যই সহজ করে তোলে। অবশ্যই, খাঁটি POSIX সমাধান কাজ করে তবে bashআপনি যে শেলটি ব্যবহার করছেন তা কোনওভাবেই কেন গ্রহণ করবেন না? আপনি সহজেই ব্রেস প্রসারণের মাধ্যমে এটি করতে পারেন :

% mkdir -v s{1..10} && ls -1d s{1..10}                                   (09-24 17:37)
mkdir: created directory `s1'
mkdir: created directory `s2'
mkdir: created directory `s3'
mkdir: created directory `s4'
mkdir: created directory `s5'
mkdir: created directory `s6'
mkdir: created directory `s7'
mkdir: created directory `s8'
mkdir: created directory `s9'
mkdir: created directory `s10'
s1
s10
s2
s3
s4
s5
s6
s7
s8
s9

5

mkdir $(seq --format 's%.0f' 1 50)

অথবা আপনি যদি শূন্য-প্যাডেড নম্বর চান (যা বাছাইয়ের জন্য ভাল):

mkdir $(seq --format 's%02.0f' 1 50)

বা:

mkdir s$(seq -s ' s' -w 1 50)- স্ট্রিংটি 's' এর ঠিক আগে নোট করুন $(), এটি ছাড়া প্রথম তৈরি ডিরেক্টরিটি 's01' এর পরিবর্তে কেবল '01' হবে

এবং পরিশেষে: mkdir $(printf "s%02i " $(seq 1 50))

seq GNU Coreutils থেকে

অদ্ভুতভাবে, সেকের --formatবা -fবিকল্পটি কেবল প্রিন্টফের ভাসমান পয়েন্টের দ্বৈত প্রকারের (যেমন চ এবং জি। একটি অদ্ভুত ভাসমান পয়েন্ট হেক্স ফর্ম্যাট যা আমি কখনও ব্যবহার করতে পারি নি) অনুমতি দেয়। কেন আমি জানি না। এটি যদি অন্যান্য printf(3)সংখ্যার মতো পূর্ণসংখ্যার (ডি, আই), অক্টাল (ও, ইউ) বা হেক্স (এক্স, এক্স) সমর্থন করে তবে এটি দুর্দান্ত হবে।

যাইহোক, 0 দশমিক নির্ভুলতার মতো একটি ডাবল ফর্ম্যাট %.0fবা %02.0fএই উদ্দেশ্যে একটি পূর্ণসংখ্যার কাছে যথেষ্ট কাছে।

$ seq - সহায়তা
ব্যবহার: সিক [বিকল্প] ... শেষ
  বা: সিক [বিকল্প] ... সর্বশেষে
  বা: সিক [বিকল্প] ... সর্বশেষতম বৃদ্ধি
সংক্ষেপের পদক্ষেপগুলিতে FIRST থেকে শেষ অবধি মুদ্রণ করুন।

  -ফ, - ফর্ম্যাট = ফর্ম্যাট প্রিন্টফ স্টাইলটি ভাসমান-পয়েন্ট ফর্ম্যাট ব্যবহার করুন
  -s, --separator = STRING পৃথক সংখ্যার জন্য STRING ব্যবহার করুন (ডিফল্ট: \ n)
  -w, --Equal-প্রস্থ নেতৃস্থানীয় জিরোগুলির সাথে প্যাডিং করে প্রস্থকে সমান করুন
      - সহায়তা সাহায্য করুন এবং প্রস্থান করুন
      --version আউটপুট সংস্করণ তথ্য এবং প্রস্থান

যদি প্রথম বা বৃদ্ধি বাদ দেওয়া হয় তবে এটি ডিফল্ট ১
লাস্ট FIRST এর চেয়ে ছোট হলেও এমনকি 1 টিতে প্রকৃত ডিফল্ট বাদ দেওয়া হয়েছে।
প্রথম, বৃদ্ধি এবং সর্বশেষে ভাসমান পয়েন্টের মান হিসাবে ব্যাখ্যা করা হয়।
FIRST শেষের চেয়ে ছোট হলে সাধারণত বৃদ্ধি হয় এবং positive
FIRST শেষের চেয়ে বড় হলে সাধারণত বৃদ্ধি নেতিবাচক হয়।
'ডাবল' টাইপের একটি যুক্তি মুদ্রণের জন্য অবশ্যই ফরমেট উপযুক্ত হতে হবে;
এটি% .PRECf এ ডিফল্ট হয় যদি FIRST, ইনক্রিমেন্ট এবং লাস্ট সবগুলি নির্দিষ্ট পয়েন্ট হয়
দশমিক সংখ্যা সর্বাধিক নির্ভুলতা PREC সহ এবং অন্যথায়% g এ।

আরও দেখুন: http://www.gnu.org/software/coreutils/manual/html_node/seq-invocation.html


{1,50}বা {01,50}(শূন্য-প্যাডিংয়ের জন্য) অনেক সহজ এবং আরও বোধগম্য।
কেভিন

1
সত্য ... আপনি যদি sh এর চেয়ে ব্যাশ ব্যবহার করেন সে কারণেই আমি @ র্যান্ডম 832 এর উত্তরটিকে আপলোড করেছি। এটি একটি ভাল উত্তর। সিক ব্যবহার করাও একটি দরকারী উত্তর।
কেস

4

কেবল আলাদা হতে হবে, এখানে একটি পসিক্স এস সমাধান সমাধান যা পুনরাবৃত্তি ব্যবহার করে:

makedirs() {
  [ "$1" -gt 0 ] || return
  mkdir "s$1"
  makedirs $(( $1 - 1 ))
}
$ makedirs 9
$ ls
s1  s2  s3  s4  s5  s6  s7  s8  s9
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.