ডেট কমান্ডের "1 মাস আগে" বিকল্পটি কীভাবে কাজ করে?


22

আমি নিশ্চিত নই যে এটি বর্তমান দিনের মধ্যে পূর্বের তারিখটি পায় বা এটিতে কেবল 30 বা 31 দিন সময় লাগে।

যেমন

যদি বর্তমান তারিখটি হয় March 28th, 1 মাস আগে অবশ্যই হওয়া উচিত February 28th, তবে এটি কখন ঘটে March 30th?

দৃশ্যপট

আমি প্রতিদিন কিছু ফাইল ব্যাকআপ করতে চাই, স্ক্রিপ্টটি এই তারিখের মধ্যে $(date +%Y%m%d)ফর্ম্যাট সহ এই ফাইলগুলিকে সংরক্ষণ করবে , যেমন 20150603_bckp.tar.gzপরের মাসে যখন আসে, 1 ম এর আগে এই সমস্ত ফাইল 1 ম এবং 15 তম ফাইল বাদ দিবে, সুতরাং এটি আমার অবস্থা:

past_month = $(date -d "-1 month" +%Y%m%d)
day = $(date +%d)
if [ "$day" != 01 ] && [ "$day" != 15 ]
then
    rm /path/of/files/${past_month}_bckp.tar.gz
    echo "Depuration done"
else
    echo "Keep file"
fi

তবে আমি জানতে চাই, তারিখ 30, 31, বা এমনকি গত ফেব্রুয়ারির উদাহরণ হলে কী হবে? এটি ফাইল রাখবে? বা দিন 1 ম ফাইল সরান?

যখন এটি 31 তম ডেপুটেশনটি কার্যকর হবে, অতীতে যদি গত মাসে কেবল 30 দিন থাকে তবে এটি প্রথম দিনটির ফাইলটি সরিয়ে ফেলবে?

আশা করি আমি ইঙ্গিত দিয়েছি।


1
আপনি কি জানেন না যে আমি এই 30 মার্চ সঠিক কারণের জন্য এখানে এসেছি
user7203

উত্তর:


24

- 1 monthমাসের সংখ্যা থেকে একটিকে বিয়োগ করবে এবং তারপরে ফলাফলের তারিখটি বৈধ না হলে ( February 30উদাহরণস্বরূপ) এটি এডজাস্ট করুন যাতে এটি বৈধ হয়। সুতরাং December 31 - 1 monthহয় December 1, নভেম্বর একটি দিন না এবং March 31 - 1 monthনেই March 3(যদি না একটি লীপ বছরের মধ্যে মৃত্যুদন্ড কার্যকর)।

এখানে গনুর জন্য তথ্য পৃষ্ঠা থেকে উদ্ধৃতি date(যা dateসংস্করণটি এই সিনট্যাক্সটি প্রয়োগ করে) এতে পাটিগণিতকে আরও শক্তিশালী করার জন্য একটি ভাল পরামর্শ অন্তর্ভুক্ত রয়েছে:

ইউনিটগুলিতে অস্পষ্টতা আপেক্ষিক আইটেমগুলির সাথে সমস্যা তৈরি করতে পারে। উদাহরণস্বরূপ, 2003-07-31 -1 month2003-07-01 এ মূল্যায়ন হতে পারে, কারণ 2003-06-31 একটি অবৈধ তারিখ। আগের মাসটিকে আরও নির্ভরযোগ্যভাবে নির্ধারণ করতে, আপনি চলতি মাসের 15 তারিখের আগে মাসের জন্য জিজ্ঞাসা করতে পারেন। উদাহরণ স্বরূপ:

    $ date -R
    Thu, 31 Jul 2003 13:02:39 -0700
    $ date --date='-1 month' +'Last month was %B?'
    Last month was July?
    $ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!'
    Last month was June!

তথ্য পৃষ্ঠা থেকে উদ্ধৃত আরেকটি সতর্কতা:

এছাড়াও, ডেলাইট সেভিং লিপসের মতো ঘড়ির পরিবর্তনের চারদিকে তারিখগুলি হেরফের করার সময় যত্ন নিন। কয়েকটি ক্ষেত্রে এগুলি ঘড়ি থেকে ২৪ ঘন্টা যতটা সংযোজন বা বিয়োগ করেছে, তাই প্রায়শই পঞ্জিকা গণনা শুরু TZকরার UTC0আগে পরিবেশের পরিবর্তনশীল স্থির করে সর্বজনীন সময় গ্রহণ করা বুদ্ধিমানের কাজ।


আমার এখানে একটি সন্দেহ আছে, বিশেষত ফেব্রুয়ারির পরিস্থিতিতে ... এটি 29 মার্চ, 30 বা 31 মার্চ যখন বর্তমানের অস্তিত্ব না থাকে তবে বিগত মাসের নিম্নলিখিত সংখ্যাটি গ্রহণ করতে পারে, সুতরাং এই তিনটি পরিস্থিতিতে এটি গ্রহণ করতে পারে ১ লা মার্চ? ২৯, ৩০, ৩১ মার্চ এবং তারপরে যেমন আপনি বলেছিলেন, মার্চ ১, ২, if এর কারণ, তবে এপ্রিল ১ মার্চ হবে পুনর্গঠনের কারণে (এটি ভালভাবে বলা হয়েছে কিনা তা আমি জানি না) যা তৈরি হয়েছিল, আপনি কী ভাবেন ?
টাকোমি

এপ্রিল 1 এর এক মাস আগে মার্চ 1 এবং মার্চ এর 1 মাস আগে 1 ফেব্রুয়ারি হয়। এগুলি সমস্যা নয়। সমস্যাটি হ'ল 31 শে মে এর এক মাস আগে 1 মে 1 এপ্রিলের অস্তিত্ব নেই। আপনার এক মাসের আগের তারিখের দিন নম্বরটি পরীক্ষা করা উচিত, বর্তমান তারিখের দিন নয়।
ধনী

2
ডোহ! যে কোনও মাসে নির্দিষ্ট কিছু দিনের "এক মাস আগে" একই মাসে পরিণতি পেতে পারে তা dateবাস্তবায়নের কাছ থেকে আমি প্রত্যাশা করি না ; আমার বইতে এটি শব্দার্থগতভাবে পাল্টা স্বজ্ঞাত। - এটি নির্দেশ করার জন্য ধন্যবাদ, এটি জেনে রাখা ভাল।
জানিস

2

আপনার ব্যাকআপ ফাইলগুলি বিশুদ্ধ করার জন্য ফাইলের উপর নির্ভর করার পরিবর্তে আপনি তাদের সময়ের মেটাডেটার উপর নির্ভর করে নিরাপদে থাকবেন।

উদাহরণস্বরূপ, আপনি এই আদেশটি দিয়ে 30 দিনেরও বেশি পুরানো সমস্ত ফাইল মুছতে পারেন:

/usr/bin/find /path/to/your/files -type f -ctime +30 -delete

একটি নিখরচায় বোনাস হিসাবে, প্রতিদিন এটি চালানো আপনাকে আরও ভাল ডিস্ক স্পেস ম্যানেজমেন্টের অনুমতি দিয়ে আপনার ব্যাকআপ ফাইলগুলিকে রোলিং মাসে রাখতে দেয়।

1 ম বা 15 তম ফাইল রাখার জন্য, আপনি সেগুলি অন্য ডিরেক্টরিতে সংরক্ষণ করতে পারেন, হয় -Not -name বিকল্পের সাথে অনুসন্ধান কমান্ডটি আপডেট করুন।


0

আপনি নিম্নলিখিতটি দ্বারা তারিখটি কীভাবে কাজ করে তা দেখার চেষ্টা করতে পারেন:

date -d "$(date -d "Mar 31 2019" +%F) +1 month ago"
Sun Mar  3 00:00:00 EET 2019

সুতরাং আমি মনে করি যে গত মাসে নিরাময়ের উপর ভিত্তি করে (নিরাময় নয়, যদি তা মার্চ হয়), নিরাময়কারী মাস থেকে গত মাস থেকে দিনের সংখ্যা হ্রাস পায়।

আপনি পুরানো ফাইলগুলি মুছতে নীচের বাক্য গঠন চেষ্টা করতে পারেন তারপরে বেশ কয়েকটি দিন (উদাহরণস্বরূপ 31 দিনের দিন)। সমস্যাটি সমাধান করার জন্য একটি লাইন (এটি একটি সহজ পদ্ধতির জন্য)।

find /path/to/folder/with/arhives/ -mindepth 1 -mtime +31 -delete

আরও বিশদ পদ্ধতির জন্য আপনি এই জাতীয় কিছু করতেও পারেন: ১. নিরাময়ের মাসের জন্য দিনের সংখ্যা সন্ধান করা:

cal $(date +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}'
  1. গত মাসের জন্য দিনের সংখ্যা সন্ধান করা:

    প্রতিধ্বনি "$ (ক্যালি $ (তারিখ +% মি) $ (তারিখ +% y) | উদাহরণস্বরূপ -v" date (তারিখ +% y) | সু "| xargs | জারজ '{প্রিন্ট $ NF}') -" $ ( ক্যাল $ (তারিখ -d "+1 মাস আগে" +% মি) $ (তারিখ +% y) | egrep -v "$ (তারিখ +% y) | সু" | xargs | awk '{প্রিন্ট $ NF}') | খ্রিস্টপূর্ব

  2. সুতরাং এখন আমরা সেই দুই মাসের মধ্যে পার্থক্যটি খুঁজে পাই:

    প্রতিধ্বনি "$ (ক্যালি $ (তারিখ +% মি) $ (তারিখ +% y) | উদাহরণস্বরূপ -v" date (তারিখ +% y) | সু "| xargs | জারজ '{প্রিন্ট $ NF}') -" $ ( ক্যাল $ (তারিখ -d "+1 মাস আগে" +% মি) $ (তারিখ +% y) | egrep -v "$ (তারিখ +% y) | সু" | xargs | awk '{প্রিন্ট $ NF}') | খ্রিস্টপূর্ব

এখন এই 3 টি পদক্ষেপে কিছু ভেরিয়েবল বরাদ্দ করা যাক। পদক্ষেপ 1 ভেরিয়েবলের নাম: এফসিএম পদক্ষেপ 2 পরিবর্তনশীল নাম: এফএলএম পদক্ষেপ 3 পরিবর্তনশীল NAme: ডিসিএল

FCM=$(cal $(date +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}')
FLM=$(al $(date -d "+1 month ago" +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}')
DCL=$(echo "$FCM-$FLM" | bc)

$ এফসিএম এবং $ এফএলএম এর পার্থক্যের ভিত্তিতে $ ডিসিএল 0 (শূন্য) সমান হলে এবং মুছুন কিনা তা যাচাই করুন:

if [ $DCL -ne 0 ]; then
    if [ $DCL -lt 0 ]; then
        find /path/to/folder/with/arhives/ -mindepth 1 -mtime +$(echo "$DCL+$FLM" | bc) -delete
    elif [ $DCL -gt 0 ]; then
        find /path/to/folder/with/arhives/ -mindepth 1 -mtime +$(echo "$DCL+$FLM" | bc) -delete
    fi
else
    find /path/to/folder/with/arhives/ -mindepth 1 -mtime +$FLM -delete
fi

আপনি "/ পাথ / টু / ফোল্ডে / উইথ / আর্টিভিজ /" এ একটি চলক যুক্ত করতে পারেন।

উপসংহার: আপনি যদি পুরানো ফাইলগুলি মুছতে চান তবে এক মাস (ঠিক), আপনার যদি "তারিখ" কমান্ড এবং "+1 মাস আগে" ব্যবহার করা হয় তবে আপনার সঠিক দিনগুলি সামঞ্জস্য করতে হবে।

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