mkdir -pএকটি ডিরেক্টরি তৈরি করবে; এটি প্রয়োজনীয় হিসাবে পিতামহুল ডিরেক্টরি তৈরি করবে।
ফাইলগুলির জন্য কি একই রকম কমান্ড উপস্থিত রয়েছে, যা প্রয়োজন মতো একটি ফাইল এবং পিতামাত ডিরেক্টরি তৈরি করবে?
mkdir -pএকটি ডিরেক্টরি তৈরি করবে; এটি প্রয়োজনীয় হিসাবে পিতামহুল ডিরেক্টরি তৈরি করবে।
ফাইলগুলির জন্য কি একই রকম কমান্ড উপস্থিত রয়েছে, যা প্রয়োজন মতো একটি ফাইল এবং পিতামাত ডিরেক্টরি তৈরি করবে?
উত্তর:
উত্স ফাইল দেওয়া হলে ইনস্টল এটি করবে /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উত্স হিসাবে এটি কেবল একটি ফাঁকা ফাইল দিতে পারেন ( উদাহরণস্বরূপ নতুনভাবে তৈরি , উদাহরণস্বরূপ)।
আমি প্রায়শই এই ধরণের পরিস্থিতিতে পড়েছিলাম, তাই আমি কেবল আমার .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'
touchp, যেমনmkdir -p
dir=$(dirname "$f")
test -d $dir || mkdir -p "$dir"
testপ্রয়োজন না হয়; mkdir -pদির ইতিমধ্যে উপস্থিত থাকলে কিছু করবে না। এমনকি কোনও ত্রুটিও ফেরায় না।
আমি এটি এক লাইনে রাখার সাথে সাথে পরামর্শ দিতে যাচ্ছিলাম, যদিও পৃথকভাবে ভেরিয়েবলটি সেট করা আপনাকে এটি পরিবর্তন করতে এবং ইতিহাস থেকে কমান্ডটি খুব সহজেই পুনরায় চালু করতে দেয়।
B="./make/this/path" && mkdir -p -- "$B" && touch -- "$B/file.txt"
এটি "নকল" করা সম্ভব।
রব গ্রিফিথস ২০০ 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.txtdeeply/nested/foo/bar.js deeply/nested/baz/fiz.txt পাইপ করা হয় xargs-I {}, xargsপ্রতিটি যুক্তি তার নিজস্ব কমান্ডে অনুবাদ করবে, সুতরাং আমাদের এখন রয়েছে:
deeply/nested/foo/bar.txtdeeply/nested/baz/fiz.txt&&চালাচ্ছি যা সংযোজকটি 3 টি কমান্ডকে ধারাবাহিকভাবে চালিত করে - প্রথম কমান্ড ফাইলটি পরিবেশের ভেরিয়েবলে সংরক্ষণ করে (যা পরবর্তী ফাইল পাসে পুনরায় ব্যবহৃত হয়) আমরা পূর্বে নিবন্ধকৃত স্থানধারক ব্যবহার করে, সুতরাং এখন আছে:
f=deeply/nested/foo/bar.txtf=deeply/nested/baz/fiz.txtmkdir -pপারি তবে আমাদের ফাইলের নামটি কেটে নেওয়া দরকার। ব্যবহার করে যথেষ্ট সহজ '${f%/*}':
mkdir -p deeply/nested/foo/mkdir -p deeply/nested/baz/fতার সম্পূর্ণতার মধ্যে পরিবর্তনশীলটিকে পুনরায় উল্লেখ করি যখন আমরা touch:
touch deeply/nested/foo/bar.txttouch deeply/nested/baz/fiz.txtcat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'যা আছে তার জন্য আপনার এই সমস্ত ব্যাখ্যা রয়েছে, যার ইউ ইউওসি রয়েছে, আপনি তখন জার্গে সাবস্কেল হয়ে যা শেলের মধ্যে ফিরে আসে, যখন একটি while readলুপ আরও বুদ্ধিমান হয়
while read f; do mkdir -p "$(dirname "$f")"; touch "$f"; done < files.txt। আপনি যে ইউইউসি-র জন্য 10 সেকেন্ডের ইন্টারনেট অনুসন্ধান করতে পারবেন না তাও বলছে