तारीख कमांड में "1 महीने पहले" विकल्प कैसे काम करता है?


22

मुझे यकीन नहीं है कि अगर यह वर्तमान दिन के भीतर अतीत की तारीख को प्राप्त करता है या यदि इसे केवल 30 या 31 दिन लगते हैं।

जैसे

यदि वर्तमान तिथि है March 28th, तो 1 महीने पहले होनी चाहिए February 28th, लेकिन जब यह होता है तो क्या होता है March 30th?

परिदृश्य

मैं हर दिन कुछ फाइलों का बैकअप लेना चाहता हूं, स्क्रिप्ट इस फाइल को वर्तमान तिथि में $(date +%Y%m%d)प्रारूप के साथ सहेज लेगी , जैसे कि 20150603_bckp.tar.gz, फिर जब अगला महीना आएगा , तो 1 महीने और 15 वीं फाइलों को छोड़कर 1 महीने पहले उन सभी फाइलों को हटा दें, इसलिए यह मेरी हालत:

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 दिन की फ़ाइल को हटा देगा?

मुझे आशा है कि मैंने संकेत दिया है।


1
क्या आप नहीं जानते कि मैं इस सटीक कारण के लिए 30 मार्च को यहाँ हूँ
user7203

जवाबों:


24

- 1 monthएक महीने की संख्या से घटाना होगा, और फिर अगर परिणामी तिथि मान्य नहीं है ( February 30उदाहरण के लिए), तो इसे समायोजित करें ताकि यह मान्य हो। तो December 31 - 1 monthहै December 1, नवंबर में एक दिन नहीं, और March 31 - 1 monthहै March 3(जब तक कि एक लीप वर्ष में मार डाला)।

यहाँ Gnu के लिए जानकारी पृष्ठ से उद्धरण 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!

एक अन्य चेतावनी, जिसे सूचना पृष्ठ से भी उद्धृत किया गया है:

इसके अलावा, ध्यान रखें कि घड़ी के आसपास की तारीखों में हेरफेर करने से दिन के उजाले की बचत होती है। कुछ मामलों में ये घड़ी से 24 घंटे के लिए जोड़ा या घटाया गया है, इसलिए अक्सर कैलेंड्रिकल गणनाओं को शुरू TZकरने UTC0से पहले पर्यावरण चर को निर्धारित करके सार्वभौमिक समय को अपनाना बुद्धिमानी है ।


मुझे इसमें संदेह है, विशेष रूप से फरवरी की स्थिति में ... जब यह मार्च 29, 30 या 31 है, तो यह पिछले महीने की निम्न संख्या ले सकता है यदि वर्तमान में मौजूद नहीं है, तो इस तीन स्थितियों में यह हो सकता है पहली मार्च सं। क्योंकि 29 मार्च, 30, 31 और फिर 1 मार्च, 2, 3 जैसा कि आपने कहा था, तो 1 अप्रैल 4 मार्च को पुनर्गठन के कारण होगा (मुझे नहीं पता कि यह अच्छी तरह से कहा गया है) जो बनाया गया था, आपको क्या लगता है ?
tachomi

1 अप्रैल से एक महीने पहले 1 मार्च है और 1 मार्च से एक महीने पहले 1 फरवरी है। ये समस्याएं नहीं हैं। समस्या यह है कि 31 मई से एक महीने पहले 1 मई है क्योंकि 31 अप्रैल मौजूद नहीं है। आपको एक-महीने की तारीख के दिन की संख्या की जांच करनी चाहिए, न कि वर्तमान तिथि के दिन की।
रिची

2
रवींद्र! तथ्य यह है कि किसी भी महीने में कुछ विशिष्ट दिनों के "एक महीने पहले" एक ही महीने में परिणाम हो सकता है कुछ भी नहीं है जो मैं एक dateकार्यान्वयन से उम्मीद करता हूं ; मेरी पुस्तक में यह शब्दार्थ-सहज है। - यह इंगित करने के लिए धन्यवाद, यह जानना अच्छा है।
Janis

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

अधिक विस्तृत दृष्टिकोण के लिए आप कुछ इस तरह से भी कर सकते हैं: 1. क्यूरेंट महीने के लिए दिनों की संख्या ढूँढना:

cal $(date +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}'
  1. पिछले महीने के दिनों की संख्या का पता लगाना:

    इको "$ (कैल $ (तिथि +% m) $ (दिनांक +% y) | उदा। -v" $ (दिनांक +% y) | सु "| xargs | awk '{print $ NF}') -" $ cal $ (दिनांक -d "+1 महीने पहले" +% m) $ (दिनांक +% y) | egrep -v "$ (दिनांक +% y) | सु" | xargs | awk '{print $ NF}') | बीसी

  2. तो अब हम उन दो महीनों के बीच अंतर पाते हैं:

    इको "$ (कैल $ (तिथि +% m) $ (दिनांक +% y) | उदा। -v" $ (दिनांक +% y) | सु "| xargs | awk '{print $ NF}') -" $ cal $ (दिनांक -d "+1 महीने पहले" +% m) $ (दिनांक +% y) | egrep -v "$ (दिनांक +% y) | सु" | xargs | awk '{print $ NF}') | बीसी

अब इस 3 चरणों में कुछ चर असाइन करते हैं। चरण 1 चर नाम: FCM चरण 2 चर नाम: FLM चरण 3 चर NAme: DCL

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)

सत्यापित करें कि $ DCL 0 (शून्य) के बराबर है और $ FCM और $ FLM के अंतर के आधार पर हटाएं:

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 महीने पहले" का उपयोग करते हुए सटीक दिनों को समायोजित करने की आवश्यकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.