পুনরাবৃত্তি mkdir


305

এমন কোনও লিনাক্স কমান্ড রয়েছে যা আমি উপেক্ষা করছি যা এর লাইন ধরে কিছু করা সম্ভব করে তোলে: (সিউডো)

$ mkdir -R foo/bar/zoo/andsoforth

অথবা ডিরেক্টরিগুলি একবারে তৈরি করার বিকল্প নেই?



1
মজার, আমি সেই পৃষ্ঠাটি দেখছিলাম কিন্তু সম্পূর্ণ "পিতামাতা" উপেক্ষা করেছি কারণ আমি তাদের শিশু হিসাবে ভাবছিলাম (বাম থেকে ডানে)।

18
প্রতিলিপি: কিছু শেল আপনি এমনকি করতে পারেন mkdir -p foo/{bar,baz}/zoo/andsoforth। খুব দরকারী!
অ্যারন কোপলি

1
ব্যক্তিগতভাবে, আমি ম্যান পৃষ্ঠায় "পিতামাতাকে" উপেক্ষা করেছি কারণ, ভাল, আমি মনে করি যে পতাকাটি "পুনরাবৃত্ত" এর জন্য "-r" হওয়া উচিত - বা খুব কমপক্ষে, এর জন্য একটি এলিফ থাকতে হবে যেহেতু mkdirকেবলমাত্র 6 আছে মোট ডকুমেন্টেড পতাকা। হ্যালো, আমি মনে করি ডিফল্টরূপে আদেশটি পুনরাবৃত্তভাবে ডিরেক্টরিগুলি তৈরি করা উচিত এবং আপনি যদি এটি না চান তবে আপনাকে অবশ্যই এগুলি স্পষ্টভাবে নির্দিষ্ট করতে হবে।
jboman

উত্তর:


511
$ mkdir -p foo/bar/zoo/andsoforth

92
এফওয়াইআই দ্য-
পিটির

14
এর পরিবর্তে তারা অন্য কমান্ডের মতো তৈরি করতে পারত, প্রতিটি লিনাক্স কমান্ডের জন্য নির্দিষ্ট পরামিতিগুলি মনে রাখা অসম্ভব
বেদমন্ত

2
তবে mkdir -pক্রস প্ল্যাটফর্ম নয়, প্রতিটি শেলটিতে কাজ করে না
40 r

9
@ РоманКоптев, mkdir -pহয় POSIX উল্লেখিত , যা সম্পূর্ণরূপে পোর্টেবল হচ্ছে নিকটস্থ জিনিস। শেল স্ক্রিপ্টে আপনি এর চেয়ে ভাল কী আশা করতে পারেন?
ওয়াইল্ডকার্ড

5
@ স্টাফানবিজিটার হ্যাঁ, এটি ইউনিক্স.স, ইউনিক্স্যান্ডউইন্ডো.স নয়। :)
EEAA

16

mkdir -pবেশিরভাগ আধুনিক ওএসের জন্য ব্যবহার করা একটি সহজ উপায়:

mkdir -p foo/bar/zoo/andsoforth

তবে mkdir -pঅনেক ম্যানুয়ালগুলিতে সুপারিশ করা হয় না। GNU এর জন্য makeএবং autoconfব্যবহারে সমস্যাগুলি সম্পর্কে ডকুমেন্টেশন পড়ুন mkdir -p:

ক্রস প্ল্যাটফর্ম ইনস্টলেশন ও কনফিগারেশন সিস্টেমগুলির নিজস্ব নিরাপদ বিকল্প রয়েছেmkdir -p

শেল কমান্ড লাইনে সিএমকে ব্যবহার করুন:

 cmake -E make_directory foo/bar/zoo/andsoforth

প্রিপ্রোসেসিং সহ স্ক্রিপ্টে অটোকনফ ব্যবহার করতে:

AS_MKDIR_P(foo/bar/zoo/andsoforth)

বা:

AC_PROG_MKDIR_P(foo/bar/zoo/andsoforth)

তবে এই সমাধানগুলির জন্য cmakeবা autoconf( M4) সরঞ্জামগুলি ইনস্টল করা প্রয়োজন (এবং সম্ভাব্য প্রাকপ্রসেসিং)

আপনি বিকল্প install-shসহ স্ক্রিপ্টও ব্যবহার করতে পারেন -d:

install-sh -d foo/bar/zoo/andsoforth

এই স্ক্রিপ্টটি ব্যবহার করে autoconfএবং automakeপ্রকল্প করে। আমি মনে করি এটি অবশ্যই নিরাপদ সমাধান হতে পারে।

সেই সময়ে আমি /bin/shনির্ভরশীলতা ছাড়াই স্ট্যান্ডার্ডের জন্য ক্রস প্ল্যাটফর্ম সমাধানটি অনুসন্ধান করেছিলাম , তবে একটিও পাইনি। তাই আমি পরবর্তী স্ক্রিপ্টটি লিখেছিলাম যা আদর্শ নাও হতে পারে তবে আমি মনে করি এটি বেশিরভাগ ক্রস প্ল্যাটফর্মের প্রয়োজনীয়তার সাথে সঙ্গতিপূর্ণ :

#! /bin/sh

cdirname() # cross platform alternative for 'dirname'
{
  # $1 - path
  test $# -eq 1 || { echo "Procedure 'cdirname' must have only one parameter. Scripting error."; exit 1; }
  echo "$1" | sed -n -e '1p' | sed  -e 's#//*#/#g' -e 's#\(.\)/$#\1#' -e 's#^[^/]*$#.#' -e 's#\(.\)/[^/]*$#\1#' -
}

mkd() # cross platform alternative for 'mkdir -p'
{
  # $1 - directory to create
  test $# -eq 1 || { echo "Function 'mkd' can create only one directory (with it's parent directories)."; exit 1; }
  test -d "$1"  && return 0
  test -d "$(cdirname "$1")" || { mkd "$(cdirname "$1")" || return 1; }
  test -d "$1" || { mkdir "$1" || return 1; }
  return 0
}

এই স্ক্রিপ্টটি পুরাতন সিস্টেম, যেখানে বিকল্পের জন্য ব্যবহার করা যেতে পারে -pজন্য mkdirঅনুপস্থিত।

sedভিত্তিক ক্রস প্ল্যাটফর্ম সংস্করণ কোড যুক্ত dirnameকরা হয়েছে। এটি এর সাথে একইভাবে কাজ করে dirname( /পথের সাথে সঠিক , কেবলমাত্র নামের সাথে পাথ , ট্রেইলিং /সহ পাথগুলি, চলার পথ ছাড়াই এবং ছাড়াই পাথ \n)। যদি পথে নতুন লোকাল বা বর্তমান লোকেলের জন্য কিছু অবৈধ অক্ষর থাকে তবে এই ফাংশনটি সঠিকভাবে কাজ করতে পারে না। এটি /( //, ///) এর যেকোন সংমিশ্রণের পরিবর্তে একক করে/

পরিবর্তিত লাইন mkdir "$1" || return 1থেকে test -d "$1" || { mkdir "$1" || return 1; }কারণ mkdirত্রুটি সহ বন্ধ করে পথ বিদ্যমান এবং এই চেক মত বাক্য ধারণকারী পাথ জন্য প্রয়োজন হয় aaa\.(যদি aaaপূর্ববর্তী সংস্করণ তৈরি করে বিদ্যমান নয় aaaএবং তারপর আবার তৈরি করার চেষ্টা করে)।

এমকেডির এই সংস্করণটি যদি ইতিমধ্যে পথ উপস্থিত থাকে তবে ত্রুটি উত্পন্ন হয় না (তবে এটি সমান্তরাল সম্পাদনে এমন ত্রুটি তৈরি করার সম্ভাবনা রয়েছে) এবং কমান্ড লাইনে বেশ কয়েকটি ডিরেক্টরি পেতে পারে না।


4
"এমকেডির-পি" পোস্টিক্স দ্বারা সংজ্ঞায়িত করা হয়। কোন ইউনিক্স বা ইউনিক্সের মতো রূপগুলি এটি সমর্থন করে না? (এবং এটি একটি শেল বিল্ট-ইন যদিও আমি অনুমান সেখানে কোন কারণে এটা হতে পারে না নয় করা উচিত হবে না।) pubs.opengroup.org/onlinepubs/9699919799/utilities/mkdir.html
টিম বি

5
এই পৃষ্ঠায় থাকা কিছু তথ্যের বয়স মাত্র 15 বছর। কারও কারও বয়স বেশি।
টমাস ডিকি

7
বিকল্পগুলির শেষ চিহ্নিত করার জন্য mkdir -pকোনও printfইউটিলিটি বা সমর্থন --পেতে সিস্টেমগুলি সমর্থন করবে না এটি খুব পুরানো হবে (এবং আমরা কমপক্ষে কয়েক দশক পুরানো কথা বলছি) ।
স্টাফেন চেজেলাস

2
আপনার cdirnameজন্য ভুল উত্তর দিতে হবে foo/bar//, বা ডিরেক্টরিতে নতুন লাইনের অক্ষর রয়েছে বা বর্তমান লোকালে অবৈধ অক্ষর রয়েছে।
স্টাফেন চেজেলাস

2
printfPOSIX সিস্টেমে নিরাপদ। পসিক্স সিস্টেম সমর্থন mkdir -pmkdir -pকয়েক দশক ধরে পসিক্স দ্বারা নির্দিষ্ট করা হয়েছে। --৮০-এর দশকের গোড়ার দিকে সিসিআইআই দিয়ে শুরু করে এটিএন্ডটি সিস্টেমগুলিতে এটি ব্যাপকভাবে শুরু হয়েছিল। printfপ্রথমে kshআমি বিশ্বাস করি এমন বিল্টিন হিসাবে উপস্থিত হয়েছিল এবং এর পরে পসিক্স দ্বারা নির্দিষ্ট করা হয়েছিল mkdir -p। কিছু পসিক্স শেল (যেমন পিডিক্স বা ইয়াশ ভিত্তিক) এখনও অন্তর্নির্মিত নেই printf
স্টাফেন চেজেলাস

0

অপশন -pকমান্ডে mkdirতোলে পি arent ডিরেক্টরি হিসাবে প্রয়োজন (যদি বিদ্যমান কোনো ত্রুটি):

mkdir -p foo/bar/zoo/andsoforth

আরেকটি উপায় হ'ল উদাহরণস্বরূপ ব্যবহার করা &&(নির্দিষ্ট ফোল্ডারটি উপস্থিত থাকলে ত্রুটি):

mkdir foo && mkdir foo/bar && mkdir foo/bar/zoo && mkdir foo/bar/zoo/andsoforth

চেইনিং অপারেটর &&শৃঙ্খলাবদ্ধ কমান্ডগুলি একসাথে ব্যবহার করতে ব্যবহৃত হয়, যেমন পরবর্তী কমান্ডটি চালিত হয় এবং কেবল যদি পূর্ববর্তী কমান্ডটি ত্রুটি ছাড়াই প্রস্থান হয়।

অবশ্যই, প্রথম উপায়টি আরও ভাল।


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