লিনাক্সে তারিখ অনুযায়ী ফোল্ডার কীভাবে তৈরি করবেন?


4

লিনাক্সে নিম্নলিখিতগুলি করার জন্য অন্য কোন স্বল্প / সহজ এবং স্মার্ট উপায় আছে কি?

cd /home/abcd/dammi
mkdir $(date +%Y-%m)
cd $(date +%Y-%m)
mkdir $(date +%d)
# RESULT : /home/abcd/dammi/2011-05/26
cd /home/wxyz/harrami
mkdir $(date +%Y-%m)
cd $(date +%Y-%m)
mkdir $(date +%d)
cd /home/abcd/harrami
mkdir $(date +%Y-%m)
cd $(date +%Y-%m)
mkdir $(date +%d)
cd /home/wxyz/harrami
mkdir $(date +%Y-%m)
cd $(date +%Y-%m)
mkdir $(date +%d)

আমাকে প্রতিদিন এবং প্রতি মাসে / হোম / এবিসিডি / ডামমি, / হোম / এবিসিডি / হাররামি, / হোম / ডাব্লিজিএজ / দামমি এবং / হোম / ডাব্লিজিএজ / হাররামির ফোল্ডার তৈরি করতে ক্রন্টব ব্যবহার করতে হবে। যে কেউ এই আমাকে সাহায্য করতে পারেন?

তথ্য:

    GROUPS : USERS
--------------------
    abcd  : abcd
    wxyz  : dammi, harrami

উত্তর:


4

নিম্নলিখিত সম্পর্কে কি:

#!/bin/bash
HOME_DIRS="/home/abcd/dammi /home/wxyz/harrami /home/abcd/harrami /home/wxyz/harrami"
DATE_DIR=$(date +%Y-%m)
DAY_DIR=$(date +%d)

for FOLDER in $HOME_DIRS; do
    mkdir -p "${FOLDER}/${DATE_DIR}/${DAY_DIR}"
done

ঠিক আছে, অবশ্যই আপনি এটি DATE_DIRএবং DAY_DIRভেরিয়েবলগুলি ছাড়াও এটি করতে পারতেন তবে এই অ্যালগরিদমটি নিশ্চিত করে যে তারিখটি বহুগুণ উত্পন্ন হয় না এবং এটি সমস্ত ব্যবহারকারীদের জন্য তারিখটি একই হওয়ার আশ্বাস দেয় (এমনকি আপনি মধ্যরাতের আগে এবং শেষের আগে এটি শুরু করলেও ডিরেক্টরি মধ্যরাতের পরে তৈরি করা হয়)।

ব্যবহারকারীদের সদ্য নির্মিত ডিরেক্টরিতে লেখার অনুমতি দেওয়ার জন্য আপনাকে মুচলেকা ব্যবহার করে স্ক্রিপ্টটি বাড়ানোর বিষয়ে ভাবতেও পারে।

সম্পাদনা: আপনি যদি দুটি /homeসাব-ফোল্ডারের মধ্যে একই ফোল্ডার কাঠামো তৈরি করতে চান তবে আপনি রোলকউয়ের স্ক্রিপ্টটি আমার এক সাথে সংযুক্ত করতে পারেন:

#!/bin/bash
USER_LIST="dammi harrami"
HOME_SUBDIRS="abcd wxyz"
DATE_DIR=$(date +%Y-%m)
DAY_DIR=$(date +%d)

for HOME_SUBDIR in $HOME_SUBDIRS; do
    for U in $USER_LIST; do
        mkdir -p "/home/${HOME_SUBDIR}/${U}/${DATE_DIR}/${DAY_DIR}"
    done
done

সম্পাদনা 2: আমি ধরে নিই ব্যবহারকারীর তালিকায় ব্যবহারকারীর নাম রয়েছে। সুতরাং আসুন আমরা স্ক্রিপ্টটি প্রসারিত করি যাতে ডিরেক্টরি মালিককে যথাযথভাবে পরিবর্তন করা যায়:

#!/bin/bash
USER_LIST="dammi harrami"
HOME_SUBDIRS="abcd wxyz"
DATE_DIR=$(date +%Y-%m)
DAY_DIR=$(date +%d)

for HOME_SUBDIR in $HOME_SUBDIRS; do
    for U in $USER_LIST; do
        mkdir -p "/home/${HOME_SUBDIR}/${U}/${DATE_DIR}/${DAY_DIR}"
        chown -R "${U}" "/home/${HOME_SUBDIR}/${U}/${DATE_DIR}"
    done
done

সম্পাদনা 3: মালিকানা পরিবর্তন করার জন্য আমি মনে করি সবচেয়ে সহজ উপায় হ'ল ডিরেক্টরি থেকে মালিকানাটি পড়া /home/<subdir>/<user>

#!/bin/bash
USER_LIST="dammi harrami"
HOME_SUBDIRS="abcd wxyz"
DATE_DIR=$(date +%Y-%m)
DAY_DIR=$(date +%d)

for HOME_SUBDIR in $HOME_SUBDIRS; do
    for U in $USER_LIST; do
        mkdir -p "/home/${HOME_SUBDIR}/${U}/${DATE_DIR}/${DAY_DIR}"
        GROUP_MEMBER=$(stat -c %G "/home/${HOME_SUBDIR}/${U}")
        chown -R "${U}":"${GROUP_MEMBER}" "/home/${HOME_SUBDIR}/${U}/${DATE_DIR}"
    done
done

নিশ্চিত যে আপনি স্ট্যাট ব্যবহার করতে পারেন মালিককে পড়তে; তবে এটি ভেরিয়েবল থেকে পড়ার চেয়ে কিছুটা ধীর - যেমন আপনি এটি চেয়েছিলেন:

#!/bin/bash
USER_LIST="dammi harrami"
HOME_SUBDIRS="abcd wxyz"
DATE_DIR=$(date +%Y-%m)
DAY_DIR=$(date +%d)

for HOME_SUBDIR in $HOME_SUBDIRS; do
    for U in $USER_LIST; do
        mkdir -p "/home/${HOME_SUBDIR}/${U}/${DATE_DIR}/${DAY_DIR}"
        OWNER=$(stat -c %U "/home/${HOME_SUBDIR}/${U}")
        GROUP_MEMBER=$(stat -c %G "/home/${HOME_SUBDIR}/${U}")
        chown -R "${OWNER}":"${GROUP_MEMBER}" "/home/${HOME_SUBDIR}/${U}/${DATE_DIR}"
    done
done

সম্পাদনা 4: হার্ড-কোডেড গ্রুপ সদস্যতা ব্যবহার করে বিকল্প সমাধান solution

#!/bin/bash
USER_LIST="dammi:group1 harrami:group2"
HOME_SUBDIRS="abcd wxyz"
DATE_DIR=$(date +%Y-%m)
DAY_DIR=$(date +%d)

for HOME_SUBDIR in $HOME_SUBDIRS; do
    for UG in $USER_LIST; do
        G=${UG##*:}
        U=${UG%%:*}
        mkdir -p "/home/${HOME_SUBDIR}/${U}/${DATE_DIR}/${DAY_DIR}"
        GROUP_MEMBER=$(stat -c %G "/home/${HOME_SUBDIR}/${U}")
        chown -R "${U}":"${G}" "/home/${HOME_SUBDIR}/${U}/${DATE_DIR}"
    done
done

সম্পাদনা 5: আপনার প্রাথমিক পোস্টটি দেখে কাঙ্ক্ষিত কাঠামোটি কিছুটা আলাদা হতে পারে। আমার ধারণা আপনি /homeপ্রতিটি গ্রুপের জন্য একটি উপ-ডিরেক্টরি রাখতে চান এবং প্রতিটি গ্রুপ সদস্যের জন্য কেবল ব্যবহারকারী-ডিরেক্টরি যুক্ত করতে চান। সুতরাং আপনি এখানে যান:

#!/bin/bash
USER_LIST="dammi:abcd dammi:wxyz harrami:wxyz"
DATE_DIR=$(date +%Y-%m)
DAY_DIR=$(date +%d)

for UG in $USER_LIST; do
    G=${UG##*:}
    U=${UG%%:*}
    mkdir -p "/home/${G}/${U}/${DATE_DIR}/${DAY_DIR}"
    chown -R "${U}":"${G}" "/home/${G}/${U}/${DATE_DIR}"
done

যদি কোনও ব্যবহারকারী একাধিক গোষ্ঠীতে সদস্য হন তবে কেবলমাত্র USER_LIST এ এটি একাধিকবার নির্দিষ্ট করে।


@ স্কাইবিম হ্যাঁ অনুমতি এখন সমস্যা তৈরি করছে। আমি কীভাবে এটি কাটিয়ে উঠতে পারি?
হিমালয়

কেবলমাত্র আরেকটি কাটা লাইন যুক্ত করুন - আমি উত্তরকেও আপডেট করেছি সাথে সাথে শাউনটি অন্তর্ভুক্ত করতে। আমার ধারণা, আপনাকে গ্রুপের মালিকানা পরিবর্তন করতে হবে না। যদি আপনার এটি করতে হয়, তবে কেবল তার পরিবর্তে 'chwon -R "$। U group": গ্রুপের নাম ...' ব্যবহার করুন।
স্কাইবিম

@ স্কাইবিয়াম আমার এই দুটি ব্যবহারকারীর জন্য দুটি আলাদা গ্রুপ রয়েছে। লুপের জন্য আরেকটি যুক্ত করার জন্য আমার কি এটি আলাদাভাবে করা উচিত?
হিমালয়

@ স্কাইবিম আসলে তিনজন ব্যবহারকারী এবং দুটি গ্রুপ রয়েছে। আমি উপরের প্রশ্নে যোগ করেছি।
হিমালয়

1
আপনি কেবল একটি 'তারিখ' $(date "+%Y-%M/%d")
অনুরোধ নিয়ে পালাতে পারেন

3

সেই -pসময়ে একাধিক উপাদানের তৈরির জন্য এমকেডির বিকল্পটি ব্যবহার করুন এবং নিজেকে পুনরাবৃত্তি এড়াতে একটি লুপ ব্যবহার করুন:

sh -c '
  for a in abcd wxyz; do 
    for b in dammi harrami; do 
      mkdir -p /home/$a/$b/$(date +%Y-%m)/$(date +%d); 
    done; 
  done
'

(লজিকাল কাঠামো দেখানোর জন্য লাইন-ব্রেক; সবই এক লাইনে থাকতে পারে)


ভাল উত্তর. এমনকি আমার চেয়ে কিছুটা দ্রুত। আমি পছন্দ করি আপনি হোম সাব ডিরেক্টরিতেও লুপ করুন। তবে তার নমুনায় তিনি 3 বার "হারামি" সাবফোল্ডার তৈরি করেন তবে ড্যামমি "ডাব্লিক্সিজ" ফোল্ডারের মধ্যে তৈরি হয় না। ঠিক আছে, যদিও এটি প্রাথমিক প্রশ্নে একটি বাগ হতে পারে। আপনি লুপ থেকে calls (তারিখ) কলগুলি সরিয়ে নিতেও চাইতে পারেন। তারিখের কলটি প্রতিটি লুপের জন্য একই মান ফেরত দেওয়ার কথা। $ () একটি কাঁটাচামচ ইস্যু করে যা লুপগুলিতে ব্যবহৃত হওয়ার সময় খুব ধীর হতে পারে।
স্কাইবিম 26'11 এ 21 '21

2
আপনি কেবল একটি 'তারিখ' $(date "+%Y-%M/%d")
অনুরোধ নিয়ে পালাতে পারেন

1
একাধিক অনুরোধগুলি dateখারাপ এবং তারিখ পরিবর্তনের ঝুঁকির কারণে কখনই করা উচিত নয়। একটি তাত্ত্বিক বাগ এখনও অনেকগুলি বাগ।
একিউম্যানাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.