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


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.