Tarih komutundaki “1 ay önce” seçeneği nasıl çalışır?


22

Bunun geçerli günü içinde geçmiş tarihi alıp almadığından veya yalnızca 30 veya 31 gün sürdüğünden emin değilim.

Örneğin

Şimdiki tarih ise March 28th, 1 ay önce olmalı February 28th, ama ne olur March 30th?

senaryo

Her gün bazı dosyaları yedeklemek istiyorum, komut dosyası bu dosyaları geçerli tarih $(date +%Y%m%d)biçiminde kaydedecek , örneğin 20150603_bckp.tar.gz, gelecek ay geldiğinde, 1 ve 15'in dosyaları hariç 1 ay önce tüm bu dosyaları kaldırın, bu yüzden şartım:

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

Ama bilmek istiyorum, tarih 30, 31 veya hatta geçtiğimiz Şubat örneğinde ne olacak? O dosyaları tutacak mı? veya 1. gün dosyaları kaldırılsın mı?

31 yaşındayken dağıtım yürütülür, bu nedenle geçen ay sadece 30 gün olsaydı, bu 1. gün dosyasını kaldıracak mı?

Umarım ima etmiştim.


1
Ben bu kesin nedene 30 Mart buradayım bilmez mi
user7203

Yanıtlar:


24

- 1 monthay numarasından bir tane çıkaracak ve sonuçta ortaya çıkan tarih geçerli değilse ( February 30örneğin), geçerli olacak şekilde ayarlayın. Yani December 31 - 1 montholup December 1, Kasım ayında bir gün değil, ve March 31 - 1 monthbir March 3(bir sıçrama yıl idam sürece).

Aritmetiği daha sağlam hale getirmek için iyi bir öneri içeren Gnu'nun ( bu sözdizimini uygulayan sürümdür) bilgi sayfasından alıntı :datedate

Birimlerdeki tüylenme göreli öğelerle ilgili sorunlara neden olabilir. Örneğin, 2003-07-31 -1 month2003-06-31 geçersiz bir tarih olduğu için 2003-07-01 olarak değerlendirilebilir. Önceki ayı daha güvenilir bir şekilde belirlemek için, geçerli ayın 15'inden önceki ayı isteyebilirsiniz. Örneğin:

    $ 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!

Bilgi sayfasından da alıntı yapılan başka bir uyarı:

Ayrıca, gün ışığından yararlanma sıçramaları gibi saat değişiklikleriyle ilgili tarihleri ​​değiştirirken de dikkatli olun. Bazı durumlarda, bunlar 24 saat kadar bir süre ekledi veya çıkardı, bu nedenle genellikle takvim TZdeğişkenine UTC0başlamadan önce ortam değişkenini ayarlayarak evrensel zamanı benimsemek akıllıca olacaktır .


Burada, özellikle de Şubat ayında şüphe duyuyorum ... 29, 30 ya da 31 Mart olduğunda, şu anki mevcut değilse, geçen ayın aşağıdaki sayısını alabilir, bu nedenle bu üç durumda 1 Mart hayır mı? Çünkü eğer 29, 30, 31 Mart ve sonra 1, 2, 3 Mart dediğiniz gibi, o zaman yapılan 1 Nisan 4 Mart olacak (iyi söylenip söylenmediğini bilmiyorum), ne düşünüyorsunuz ?
tachomi

1 Nisan'dan bir ay önce 1 Mart ve 1 aydan bir ay önce 1 Şubat. Bunlar sorun değil. Sorun şu ki, 31 Mayıs'tan bir ay önce 1 Mayıs, çünkü 31 Nisan yok. Geçerli tarihin gününü değil, bir ay önceki tarihin gün numarasını kontrol etmelisiniz.
rici

2
Doh! Herhangi bir aydaki bazı belirli günlerin "bir ay önce" nin aynı ay içinde sonuçlanabileceği bir dateuygulamadan beklediğim bir şey değildir ; kitabımda anlamsal olarak sezgisel. - İşaret ettiğin için teşekkürler, bilmek güzel.
Janis

2

Yedek dosyalarınızı temizlemek için dosya adlarına güvenmek yerine, zaman meta verilerine güvenerek daha güvende olursunuz.

Örneğin, bu komutla 30 günden eski tüm dosyaları silebilirsiniz:

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

Ücretsiz bir bonus olarak, bunu her gün çalıştırmak yedek dosyalarınızı hareketli bir ayda tutmanıza izin vererek daha iyi bir disk alanı yönetimi sağlar.

1. veya 15. dosyaları saklamak için, dosyaları başka bir dizinde depolayabilir veya find komutunu -not -name seçeneğiyle güncelleyebilirsiniz.


0

Tarihin nasıl çalıştığını aşağıdakilerle öğrenmeye çalışabilirsiniz:

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

Bu yüzden geçen ayki akıntıya dayanarak (eğer Mart ayıysa akıntı değil), aktüel aydan geçen ayın gün sayısını azalttığını düşünüyorum.

Birkaç günden eski dosyaları silmek için aşağıdaki sözdizimini deneyebilirsiniz (31 günün altındaki örnekte). Sorunu çözmek için bir satır (bu basit bir yaklaşım içindir).

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

Daha ayrıntılı bir yaklaşım için şöyle bir şey de yapabilirsiniz: 1. Mevcut ayın gün sayısını bulma:

cal $(date +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}'
  1. Geçen ayın gün sayısını bulma:

    echo "$ (cal $ (tarih +% m) $ (tarih +% y) | egrep -v" $ (tarih +% y) | Su "| xargs | awk '{print $ NF}') -" $ ( cal $ (tarih -d "+1 ay önce" +% m) $ (tarih +% y) | egrep -v "$ (tarih +% y) | Su" | xargs | awk '{print $ NF}') | M.Ö

  2. Şimdi bu iki ay arasındaki farkı buluyoruz:

    echo "$ (cal $ (tarih +% m) $ (tarih +% y) | egrep -v" $ (tarih +% y) | Su "| xargs | awk '{print $ NF}') -" $ ( cal $ (tarih -d "+1 ay önce" +% m) $ (tarih +% y) | egrep -v "$ (tarih +% y) | Su" | xargs | awk '{print $ NF}') | M.Ö

Şimdi bu 3 adıma bazı değişkenler atayalım. Adım 1 Değişken Adı: FCM Adım 2 Değişken Adı: FLM Adım 3 Değişken 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'nin 0 (sıfır) olup olmadığını doğrulayın ve $ FCM ile $ FLM arasındaki farka göre silin:

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

"/ Path / to / folde / ile / arhives /" değişkenini de ekleyebilirsiniz.

Sonuç: Bir aydan eski dosyaları (tam olarak) silmek istiyorsanız, "tarih" komutunu ve "+1 ay önce" kullanıyorsanız, tam gün sayısını ayarlamanız gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.