ফাইলের জন্য mkdir -p


24

mkdir -pএকটি ডিরেক্টরি তৈরি করবে; এটি প্রয়োজনীয় হিসাবে পিতামহুল ডিরেক্টরি তৈরি করবে।

ফাইলগুলির জন্য কি একই রকম কমান্ড উপস্থিত রয়েছে, যা প্রয়োজন মতো একটি ফাইল এবং পিতামাত ডিরেক্টরি তৈরি করবে?


এটি সম্পর্কে আমি সচেতন নই .. তবে আপনি কেবল mkdir -p / path / to / make && টাচ / পাথ / টু / ফাইল করতে পারেন ... যা আপনার প্রয়োজন অনুসারে তৈরি করা নতুন ডিরেক্টরি কাঠামোর একটি ফাঁকা ফাইল তৈরি করবে।

1
সঙ্গে মেশা @Kansha যে dirnameএবং basenameএবং আমরা শুধুমাত্র একক যুক্তি প্রয়োজন হবে; লাভ! :)

হাই, ভাল কল।

উত্তর:


29

উত্স ফাইল দেওয়া হলে ইনস্টল এটি করবে /dev/null-Dযুক্তি সব পিতা বা মাতা ডিরেক্টরি তৈরি করতে বলে:

anthony@Zia:~$ install -D /dev/null /tmp/a/b/c
anthony@Zia:~$ ls -l /tmp/a/b/c 
-rwxr-xr-x 1 anthony anthony 0 Jan 30 10:31 /tmp/a/b/c

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


7

না, এটি আমি যতটা জানি জানি না। তবে আপনি সর্বদা mkdir -pএবং touchএকে অপরের পরে ব্যবহার করতে পারেন :

f="/a/b/c.txt"
mkdir -p -- "${f%/*}" && touch -- "$f"

3

আমি প্রায়শই এই ধরণের পরিস্থিতিতে পড়েছিলাম, তাই আমি কেবল আমার .bashrcফাইলে একটি ফাংশন লিখেছি । দেখে মনে হচ্ছে

function create() {
    arg=$1
    num_of_dirs=$(grep -o "/" <<< $arg | wc -l)
    make_dirs=$(echo $arg | cut -d / -f1-$num_of_dirs)
    mkdir -p $make_dirs && touch $arg
}

সুতরাং, যখন আমি অস্তিত্বহীন ডিরেক্টরিগুলির একটি পথের ভিতরে কোনও ফাইল তৈরি করতে চাই, তখন আমি বলব

create what/is/it  # will create dirs 'what' and 'is', with file 'it' inside 'is'

1
আমার মানুষ! - আপনাকে ধন্যবাদ, আমি এটি বলেছিলাম touchp, যেমনmkdir -p
পরিবেশগত

0
dir=$(dirname "$f")
test -d $dir || mkdir -p "$dir"

3
testপ্রয়োজন না হয়; mkdir -pদির ইতিমধ্যে উপস্থিত থাকলে কিছু করবে না। এমনকি কোনও ত্রুটিও ফেরায় না।
ডারোবার্ট

1
এবং অবশ্যই, এটি কেবল ডিরেক্টরি তৈরি করে।
একটি সিভিএন

0

আমি এটি এক লাইনে রাখার সাথে সাথে পরামর্শ দিতে যাচ্ছিলাম, যদিও পৃথকভাবে ভেরিয়েবলটি সেট করা আপনাকে এটি পরিবর্তন করতে এবং ইতিহাস থেকে কমান্ডটি খুব সহজেই পুনরায় চালু করতে দেয়।

B="./make/this/path" && mkdir -p -- "$B" && touch -- "$B/file.txt"

0

এটি "নকল" করা সম্ভব।

প্রথমত, কিছু প্রয়োজনীয় তত্ত্ব:

রব গ্রিফিথস ২০০ 2007 সালে ম্যাকওয়ার্ল্ড.কম এ সহজেই প্রচুর নতুন ফোল্ডার তৈরি করুন শিরোনামে একটি নিবন্ধ পোস্ট করেছিলেন যেখানে তিনি নির্দেশাবলী ব্যবহার করে xargsফাইলগুলির একটি তালিকায় পড়ার জন্য কমান্ডটি ব্যবহার করে আলোচনা করেছিলেন mkdir

xargsপতাকা সহ একটি placeholder( {}) রেফারেন্স করতে সক্ষম -I, এতে প্রতিটি আর্গুমেন্টের জন্য মূল্য দেওয়া আছে xargs। এখানে পতাকাটির সাথে এবং বাইরে পার্থক্য রয়েছে:

$ foo.txt bar.txt | xargs echo
$ => foo.txt bar.txt
$ foo.txt bar.txt | xargs -I {} echo {}
$ => foo.txt
$ => bar.txt

xargssh -cপতাকা সহ নির্বিচারে শেল কমান্ড চালাতে সক্ষম :

foo.txt bar.txt | xargs sh -c 'echo arbitrary command!'

ধারণাগুলির সংমিশ্রণ:

আমরা এই ধারণাগুলির mkdir -pপরিবর্তে mkdirএবং ধারণার সাথে @ldx এর উত্তরে একত্রিত করতে পারি এটি উত্পাদন করতে:

$ cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'

এই কমান্ডটি মূলত প্রতিটি ফাইলের নাম একটি ফাইলের লাইন-বিচ্ছিন্ন তালিকায় ম্যাপ করে, ফাইল অংশটি ছাড়ে, ডিরেক্টরিগুলি তৈরি করে mkdir -pএবং তারপরে ডিরেক্টরি সম্পর্কিত ফাইল ডিরেক্টরিটি সম্পর্কিত ডিরেক্টরিতে তৈরি করে touch

উপরের কমান্ডটিতে যা ঘটে তা এখানে একটি বিচ্ছেদের কথা:

উদাহরণস্বরূপ আমার files.txtচেহারা এর মত বলুন :

deeply/nested/foo/bar.txt
deeply/nested/baz/fiz.txt
  • cat files.txt উত্পাদন করে deeply/nested/foo/bar.js deeply/nested/baz/fiz.txt
  • deeply/nested/foo/bar.js deeply/nested/baz/fiz.txt পাইপ করা হয় xargs
  • যেহেতু আমরা ব্যবহার করেছি -I {}, xargsপ্রতিটি যুক্তি তার নিজস্ব কমান্ডে অনুবাদ করবে, সুতরাং আমাদের এখন রয়েছে:
    • deeply/nested/foo/bar.txt
    • deeply/nested/baz/fiz.txt
  • তারপরে আমরা একটি শেল কমান্ড &&চালাচ্ছি যা সংযোজকটি 3 টি কমান্ডকে ধারাবাহিকভাবে চালিত করে - প্রথম কমান্ড ফাইলটি পরিবেশের ভেরিয়েবলে সংরক্ষণ করে (যা পরবর্তী ফাইল পাসে পুনরায় ব্যবহৃত হয়) আমরা পূর্বে নিবন্ধকৃত স্থানধারক ব্যবহার করে, সুতরাং এখন আছে:
    • f=deeply/nested/foo/bar.txt
    • f=deeply/nested/baz/fiz.txt
  • আমাদের এখন একটি ভেরিয়েবল রয়েছে যা আমরা পাস করতে mkdir -pপারি তবে আমাদের ফাইলের নামটি কেটে নেওয়া দরকার। ব্যবহার করে যথেষ্ট সহজ '${f%/*}':
    • mkdir -p deeply/nested/foo/
    • mkdir -p deeply/nested/baz/
  • এবং তারপরে আমরা কেবল fতার সম্পূর্ণতার মধ্যে পরিবর্তনশীলটিকে পুনরায় উল্লেখ করি যখন আমরা touch:
    • touch deeply/nested/foo/bar.txt
    • touch deeply/nested/baz/fiz.txt

2
মূলত cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'যা আছে তার জন্য আপনার এই সমস্ত ব্যাখ্যা রয়েছে, যার ইউ ইউওসি রয়েছে, আপনি তখন জার্গে সাবস্কেল হয়ে যা শেলের মধ্যে ফিরে আসে, যখন একটি while readলুপ আরও বুদ্ধিমান হয়
স্টিভেন পেনি

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

1
আমার শেষ মন্তব্যটি পুরোপুরি ব্যাখ্যা করে explains আপনার সম্পূর্ণ উত্তর হিসাবে ভাল আরও লেখা যেতে পারে while read f; do mkdir -p "$(dirname "$f")"; touch "$f"; done < files.txt। আপনি যে ইউইউসি-র জন্য 10 সেকেন্ডের ইন্টারনেট অনুসন্ধান করতে পারবেন না তাও বলছে
স্টিভেন পেনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.