আমি কীভাবে প্রতিমাসের নাম অনুসারে ডিরেক্টরিগুলি তৈরি করব?


8

আমি প্রতি মাসের জন্য একটি ডিরেক্টরি নাম তৈরি করতে চাই। আমি জানি, কিছুটা খোলের সাথে খেলে, যা:

date -d 1/01 +%b # Gives Jan
date -d 2/01 +%b # Gives Feb
.
date -d 12/01 +%b # Gives Dec

সুতরাং আমি ব্রেস প্রসারণ ব্যবহার করেছি echo {1..12}/01এবং চেষ্টা xargsকরেছি:

echo {1..12}/01 | xargs -n 1 -I {} date -d {} +%b

তবে এটি খারাপভাবে ব্যর্থ: / (পরে আমি প্রয়োগ করতে চাই mkdir)। কিভাবে আমি এটি করতে পারব?


4
আপনি এটি অতিরিক্ত প্রোগ্রামিং বলে মনে করছেন। যদি কোনও কারণ থাকে তবে আপনি যদি 12 বার লাইন লিখেন না কেন, তা ব্যাখ্যা করতে সাহায্য করবে "এমকেডির" জান "; এমকিডির" ফেব্রুয়ারি "; ..."। আপনার যদি এটি একাধিকবার করার দরকার হয় তবে কোডটি কোনও ফাংশনে রেখে দিন এবং প্রয়োজন মতো কল করুন।
— জামেস্কেফ

4
আপনি কেন আপনার ডিরেক্টরিতে 01-12 সংখ্যার পরিবর্তে মাসের নাম দিয়ে নামকরণ করছেন ? তাদের lsবর্ণমালা অনুসারে এডিট করা আবশ্যক (এপ্রিল, আগস্ট, ডিসেম্বর, ফেব্রুয়ারি, জানুয়ারি, জুলাই, মার্চ, মে, নভেম্বর, অক্টোবর, সেপ্টেম্বর)।
— ব্যবহারকারী 1024

2
@ জেমসেকফ আপনি যখন এমনটি করতে পারবেন যখন আপনি কেবল তা করতে পারেন mkdir january february [...]? যদি না আপনি সত্যিই এগুলিকে আলাদা করে তৈরি করতে চান তবে আপনি যেভাবে পরামর্শ দিয়েছেন সেভাবে এটি করার দরকার নেই।
— প্রাইফটান

@ user1024 আমি সাধারণত আপনার সাথে একমত হব তবে আমার একটি ব্যবহারের ক্ষেত্রে মাসের নাম রয়েছে (যদিও ছোট ক্ষেত্রে); অন্য একটিতে আমার ০১ জানুয়ারী ইত্যাদি আছে কে বলতে পারে? এটি হতে পারে বা এক উপায় বা অন্যতর হতে পারে এমন অনেকগুলি কারণ রয়েছে। (তবে হ্যাঁ - যদি বাছাই করা কোনও সমস্যা হয় ...)
— প্রাইফটান

@ প্রিফটান: সংক্ষিপ্ত রেখাগুলির জন্য কেবলমাত্র ব্যক্তিগত পছন্দ :-) এছাড়াও, পরে যদি আমি উদাহরণস্বরূপ "০১ জানুয়ারী" তে পরিবর্তন করতে চাইতাম তবে আমার সম্পাদকের পক্ষে পরিবর্তনের চেয়ে "সি / / 01/12 1" করা আরও সহজ এক লাইন.
— জামেএসকিফ

উত্তর:


17

এর সাথে -I, xargsপ্রতি যুক্তিটির ডিফল্টের বিপরীতে (খালি বা নিউলাইন সীমিত, সম্ভবত উদ্ধৃত) শব্দের ছাড়াই -I(এবং বোঝানো হয় -n) সাথে প্রতি লাইনে একটি যুক্তি পায় । সুতরাং আপনার উদাহরণে dateকেবল একবার বলা {}হয় পুরো বার আউটপুট echo(যা এক লাইনে থাকে) এর বিস্তৃত সহ , পিছনে থাকা নতুন লাইনের বিয়োগ করা।

এখানে আপনি করতে পারেন (নোট যে এটি -dএকটি জিএনইউ এক্সটেনশন):

printf '%s\n' {1..12}/01 | xargs -I {} date -d {} +%b | xargs mkdir --

(মনে রাখবেন যে এটি লোকেলগুলিতে সঠিকভাবে কাজ করবে না যেখানে মাসের নামের সংক্ষিপ্তসারগুলিতে ফাঁক বা উদ্ধৃতি অক্ষর থাকে; জিএনইউ দিয়ে xargsআপনি এটি ব্যবহার করে কাজ করতে পারেন xargs -d '\n' mkdir --)

এখন, আপনার লোকালে মাসের সংক্ষিপ্তসারগুলির তালিকা পেতে, লোকালটিকে সরাসরি জিজ্ঞাসা করা আরও অর্থবোধ করবে:

(IFS=';'; set -o noglob; mkdir -- $(locale abmon))

( locale -k LC_TIMEবিভাগে সমস্ত স্থানীয় ডেটা দেখতেও দেখুন LC_TIME)।

অথবা নেটিভ মধ্যে zsh:

zmodload zsh/langinfo
mkdir -- ${(v)langinfo[(I)ABMON_*]}

কমপক্ষে জিএনইউ সিস্টেমে কিছু লোকেলগুলিতে মাসের সংক্ষিপ্তসারগুলি স্পেস সহ স্থির প্রস্থে প্যাড করা হয়:

$ LC_ALL=et_EE.UTF-8 locale title abmon
Estonian locale for Estonia
jaan ;veebr;märts;apr  ;mai  ;juuni;juuli;aug  ;sept ;okt  ;nov  ;dets
$ LC_ALL=zh_TW.UTF-8 locale title abmon
Chinese locale for Taiwan R.O.C.
 1月; 2月; 3月; 4月; 5月; 6月; 7月; 8月; 9月;10月;11月;12月

আপনি যে প্যাডিং অপসারণ করতে পারেন।

নেতৃস্থানীয় স্পেসগুলি মুছে ফেলা হবে xargs -I, তবে চলমান স্থানগুলি নয়। সাথে zsh:

zmodload zsh/langinfo
set -o extendedglob
mkdir -- ${${${(v)langinfo[(I)ABMON*]}##[[:space:]]#}%%[[:space:]]#}

নিস! সম্পর্কে জানতাম না locale abmon।
— মোলিংলাভস 10:25 এগ্রো

নিস উত্তর, কিন্তু TL; ড: IFS=';'; set -o noglob; mkdir -- $(locale abmon)। ;)
— সিকিপি লে গ্র্যান্ড গৌরোগ

9

একটি লুপ চেষ্টা করে দেখুন?

$ for m in {1..12}; do
> date -d "$m"/01 +%b
> done
jan
feb
mar
apr
maj
jun
jul
aug
sep
okt
nov
dec

আপনি যদি প্রতি মাসে ডিরেক্টরি তৈরি করতে চান তবে আমি এমন কিছু করব:

for m in {1..12}; do newdir=$(date -d "$m"/01 +%b); mkdir "$newdir"; done

{1..12}এটি একটি বাশিজম নোট । পসিক্স শেলের জন্য, ব্যবহার করুন for m in $(seq 1 12)...(তবে খেয়াল করুন যে seqনিজেই
— পসিএক্সের

2
@ রদোভানগারাবাক, প্রযুক্তিগতভাবে, {1..12}একটি zshism যা পরে ksh93, বাশ এবং অন্যান্য কয়েকটি শেল দ্বারা অনুলিপি করা হয়েছিল।
— স্টাফেন চেজেলাস

5

ব্রেস প্রসারিত শেলগুলিতে এবং DATAFILE ইনপুট গ্রহণের তারিখ দিয়ে চেষ্টা করুন

echo {01..12}/01$'\n' | date -f- +"mkdir %b"

ফলাফলের সাথে সন্তুষ্ট হলে এবং শেলের মধ্যে পাইপ।


5

-IXargs এর ডিলিমিটার পরিবর্তনগুলি ব্যবহার করার কারণে আপনার আদেশটি কার্যকর হয় না :

-আমি
স্ট্যান্ডার্ড ইনপুট থেকে নাম পড়ার সাথে প্রাথমিক-তর্কগুলিতে প্রতিস্থাপন-স্ট্রের ঘটনাগুলি প্রতিস্থাপন করি। এছাড়াও, অব্যক্ত ফাঁকাগুলি ইনপুট আইটেমগুলি শেষ করে না; পরিবর্তে বিভাজক হ'ল নতুন লাইন চরিত্র।

আপনি যোগ করতে পারেন -d " "এটি কাজ করা xargs করতে। তবে আপনার এমনকি -I{}আপনার প্রয়োজন নেই:

এটা চেষ্টা কর,

echo {1..12}/01 | xargs -n1 date +%b -d | xargs mkdir

1
নোট করুন যে GNU এর dateজন্য অপ্রয়োজনীয় যুক্তিগুলির পরে বিকল্পগুলি গ্রহণ করার জন্য , POSIXLY_CORRECTপরিবেশে অবশ্যই কোনও পরিবর্তনশীল থাকতে হবে না ।
— স্টাফেন চেজেলাস

3

তুমি যেখানে এত কাছে।

সমস্যাটি হ'ল প্রতিধ্বনিগুলি একটি একক লাইন তৈরি করছে 1/01 2/01 3/01 4/01 5/01 6/01 7/01 8/01 9/01 10/01 11/01 12/01এবং সেই এক্সারগস ক্ষেত্র বিভাজক (স্থান নয়) হিসাবে নিউলাইন চরিত্রটি ব্যবহার করছে।

সমাধান: প্রতি ক্ষেত্রের মধ্যে একটি স্থান রাখার জন্য প্রতিধ্বনি বলুন।

echo -e {1..12}/01\\n | xargs -n 1 -I {} date -d {} +%b

আমি কেবল \\nপ্রতিধ্বনির শেষে সন্নিবেশ করলাম ।

তারপরে ডিরেক্টরিগুলি যুক্ত করতে |xargs mkdir

যেমন

echo -e {1..12}/01\\n | xargs -n 1 -I {} date -d {} +%b | xargs mkdir


1

এটি করার সবচেয়ে সহজ এবং শক্তিশালী উপায়:

mkdir jan feb mar apr maj jun jul aug sep okt nov dec

এটি মাসের পরে স্থির তালিকা ...

আপনি গনুহ ব্যবহার করে অভিপ্রায় হন date(এখানে একটি অপরিবর্তিত অভিমানী $IFSএবং গনুহ dateআপনার মত date -d):

mkdir $( printf '%s\n' {1..12}/01 | date -f - +%b )

2
এটি বাদ দিয়ে এটি ব্যবহারকারীর ভাষায় মাসের নাম সংক্ষেপণ করে না।
— স্টাফেন চেজেলাস

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