আমি কীভাবে এমকিডিরকে dir1 তৈরি করার চেষ্টা করতে বলি, এবং যদি এটি ইতিমধ্যে বিদ্যমান থাকে তবে dir2, ইত্যাদি তৈরি করুন, যতক্ষণ না এটি অস্তিত্বহীন এমন একটি নামকে আঘাত না করে?


13

আমি শেষে একটি সংখ্যার সাথে একটি ডিরেক্টরি তৈরি করতে চাই, প্রাক্তন "dir1", এবং সেই সংখ্যাটি বৃদ্ধি করা যদি ডিরেক্টরিটি ইতিমধ্যে উপস্থিত না থাকে যতক্ষণ না এটি উপস্থিত না থাকা কোনও ডিরেক্টরিটির নাম হিট না করে, এবং আমাকে এটি একটি একক লাইনে এটি করতে হবে একটি লিনাক্স কমান্ড লাইন, এরকম কিছু:

mkdir --increment dir$

আমি কীভাবে এটি করতে যাব?

এখনও পর্যন্ত আমি এটি পেয়েছি:

dir=output; n=0; mkdir -p $dir$n; if test -d $dir$n; then n=$((n+1)); echo $dir$n; fi

তবে এটি কেবল পরবর্তী ডিয়ার নামটি প্রতিধ্বনিত করে, পুনরায় ক্রমানুসারে কমান্ডটি কার্যকর করা দরকার।

উত্তর:


26

এটি ব্যবহারের ক্ষেত্রে একটি তুচ্ছ অনুশীলন while:

এন = 0
যখন! mkdir dir $ n
করা
    এন = $ ((ঢ + 1 টি))
সম্পন্ন

তবে অবশ্যই বুঝতে হবে যে এই তুচ্ছ প্রক্রিয়াটি ভালভাবে স্কেল করে না thought

সুতরাং চাকাটি পুনরায় উদ্ভাবন করার পরিবর্তে এবং সমস্ত কোণটি আবার শেভ করার পরিবর্তে, কোনও টেমপ্লেট থেকে কিছুটা আলাদাভাবে অনন্য অস্থায়ী ডিরেক্টরি তৈরি করে:

নাম = $ (mktemp -d dirXXXXXXXXXXX)


সংখ্যাটিতে বাইনারি অনুসন্ধান যথেষ্ট ভাল হতে পারে।
থোরবজর্ন রাভন অ্যান্ডারসন

আপনি যেখানে চাকা পুনর্বিন্যাস প্রক্রিয়া শুরু করছেন সেখান থেকে শেভ করার জন্য বেশ কয়েকটি কোণ রয়েছে, সুরক্ষা এবং সমান্তরালতার কথা বিবেচনা করে ফাইল-সিস্টেমের মধ্যে কমপক্ষে কোনটি মনে নেই।
জেডিবিপি

6

আপনি যদি কেবল ক্রমবর্ধমানভাবে সঠিক ক্রমে তালিকাভুক্ত ডিরেক্টরিগুলি তৈরি করতে চান, তবে আমি কি পরিবর্তে বর্তমান তারিখের ভিত্তিতে নামকরণ করা ফোল্ডারগুলিতে সুপারিশ করতে পারি?

DATE=$(date +%F)
mkdir "dir-$DATE"

এটি নামের নামের সাথে ডিরেক্টরি তৈরি করবে dir-2014-03-02( YYYY-MM-DDযাতে বর্ণমালা অনুসারে প্রদর্শিত হয়)।

আপনি যদি প্রতিদিন একাধিক ডিরেক্টরি তৈরি করেন তবে আপনি বর্তমান সময়টিকে ফাইলের নামের সাথে যুক্ত করতে পারেন। man dateএর আউটপুট ফর্ম্যাটিং কীভাবে টুইঙ্ক করবেন তা দেখুন date


5

প্রথমে "বৃহত্তম" নামটি সন্ধান করুন, সংখ্যা এবং বর্ধিত সংখ্যাটি পান:

last_dir=(printf "%s\n" dir* | sort -Vr | head -1)
num=$(last_dir#dir)
mkdir "dir$((num+1))"

এটি একটি ভাল ধারণা, তবে প্যারালাইজ করা সহজ নয়।
থোরবজর্ন রাভন অ্যান্ডারসন

লক্ষ লক্ষ ডিরেক্টরি না থাকলে সমান্তরালিতা অবশ্যই অকাল অপটিমাইজেশন।
গ্লেন জ্যাকম্যান

তোমার printfএখানে কেন দরকার হবে ? সহজ echoকাজ করবে না ?
রুসলান

এছাড়াও, আমি এর dir[0-9]*পরিবর্তে ব্যবহার করব dir*
রুসলান

1
আপনি ভুল বুঝছেন. আমি স্ক্রিপ্ট একবারে একাধিকবার (একাধিক থ্রেড, একাধিক ব্যবহারকারী ইত্যাদি) চালানোর জন্য বুদ্ধিমান কিনা তা নিয়ে কথা বলি।
থরবজর্ন রাভন অ্যান্ডারসন

2

ধরে নিচ্ছি যে আপনার ডিরেক্টরিগুলি সর্বদা "dir1" থেকে শুরু হয়, এবং i dir * নামে কোনও ফাইল নেই (আইটি তারা ক্রমানুসারে সংখ্যাযুক্ত ডিরেক্টরি), আপনি এই একটি লাইনারের সাথে দূরে যেতে পারেন -

mkdir ${dir}$(( `ls ${dir}* | wc -w` + 1 ))

এটি $ dir দিয়ে শুরু হওয়া ফাইলগুলির সংখ্যা গণনা করে, তারপর সেই সংখ্যায় একটি যুক্ত করে এবং একটি নতুন ফাইল তৈরি করে।


0

অন্যান্য উত্তরের সাথে সংযোজন: নাম অনুসারে সঠিকভাবে সাজানোর জন্য আপনার যদি ডায়ার প্রয়োজন হয় তবে আপনি একটি নির্দিষ্ট দৈর্ঘ্যের শীর্ষস্থানীয় জিরো সহ নতুন দির নম্বর (NUM) প্যাড করতেও পারেন।

নিম্নলিখিতগুলি এক লাইনে ঘনীভূত হতে পারে বা অন্য সমাধানগুলির মধ্যে একটিতে এম্বেড করা যেতে পারে।

NUM="00"$NUM                  ## Left zero pad with fixed length - 1 zeros 
NUM=${NUM:((${#NUM} - 3)):3}  ## left trim to fixed length (3 in this case)

এটি ধরে নিয়েছে যে NUM কমপক্ষে 1 ডিজিট দীর্ঘ দীর্ঘ শুরু করবে এবং নির্দিষ্ট দৈর্ঘ্যের বেশি হবে না। আপনার প্রয়োজনীয়তা অনুসারে সামঞ্জস্য করুন।

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