Saya tidak yakin apakah ini mendapatkan tanggal yang lalu dalam hari ini atau jika hanya butuh 30 atau 31 hari untuk itu.
misalnya
Jika tanggal saat ini March 28th
, 1 bulan yang lalu harus February 28th
, tetapi apa yang terjadi ketika itu March 30th
?
Skenario
Saya ingin mencadangkan beberapa file setiap hari, skrip akan menyimpan file ini dalam tanggal saat ini dengan $(date +%Y%m%d)
format, seperti 20150603_bckp.tar.gz
, kemudian ketika bulan berikutnya tiba, hapus semua file dalam 1 bulan yang lalu kecuali file ke-1 dan ke-15, jadi ini adalah kondisi saya:
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
Tapi saya ingin tahu, apa yang akan terjadi ketika tanggal 30, 31 atau bahkan contoh Februari lalu? Itu akan menyimpan file-file itu? atau hapus file hari ke-1?
Ketika tanggal 31 masa depurasi akan dieksekusi, jadi jika bulan lalu hanya memiliki 30 hari, ini akan menghapus file hari pertama?
Saya harap saya mengisyaratkan.
Jawaban:
- 1 month
akan mengurangi satu dari nomor bulan, dan kemudian jika tanggal yang dihasilkan tidak valid (February 30
, misalnya), sesuaikan sehingga valid. BegituDecember 31 - 1 month
jugaDecember 1
, bukan hari di bulan November, danMarch 31 - 1 month
ituMarch 3
(kecuali dieksekusi pada tahun kabisat).Berikut ini kutipan dari halaman info untuk Gnu
date
(yang merupakandate
versi yang mengimplementasikan sintaksis ini), yang mencakup saran bagus untuk membuat aritmatika lebih kuat:Peringatan lain, juga dikutip dari halaman info:
sumber
date
implementasi; dalam buku saya ini kontra-intuitif secara semantik. - Terima kasih telah menunjukkan itu, itu baik untuk diketahui.Alih-alih mengandalkan nama file untuk membersihkan file cadangan Anda, Anda akan lebih aman mengandalkan metadata waktu mereka.
Misalnya Anda dapat menghapus semua file yang lebih lama dari 30 hari dengan perintah ini:
Sebagai bonus gratis, menjalankan ini setiap hari akan memungkinkan Anda untuk menyimpan file cadangan pada bulan bergulir, memungkinkan manajemen ruang disk yang lebih baik.
Untuk menyimpan file ke-1 atau ke-15, Anda bisa menyimpannya di direktori lain, perbarui perintah temukan dengan opsi -not -name.
sumber
Anda dapat mencoba melihat bagaimana tanggal bekerja dengan yang berikut:
Jadi saya pikir berdasarkan pada curent bulan lalu (bukan curent, kalau itu Maret), mengurangi jumlah hari dari bulan terakhir dari bulan curent.
Anda dapat mencoba sintaks berikut untuk menghapus file yang lebih lama dari beberapa hari (dalam contoh di bawah 31 hari). Satu baris untuk menyelesaikan masalah (ini untuk pendekatan sederhana).
Untuk pendekatan yang lebih rinci, Anda juga dapat melakukan sesuatu seperti ini: 1. Menemukan jumlah hari untuk bulan terakhir:
Menemukan jumlah hari untuk bulan terakhir:
echo "$ (cal $ (tanggal +% m) $ (tanggal +% y) | egrep -v" $ (tanggal +% y) | Su "| xargs | awk '{print $ NF}') -" $ ( cal $ (tanggal -d "+1 bulan lalu" +% m) $ (tanggal +% y) | egrep -v "$ (tanggal +% y) | Su" | xargs | awk '{print $ NF}') | bc
Jadi sekarang kita menemukan perbedaan antara dua bulan itu:
echo "$ (cal $ (tanggal +% m) $ (tanggal +% y) | egrep -v" $ (tanggal +% y) | Su "| xargs | awk '{print $ NF}') -" $ ( cal $ (tanggal -d "+1 bulan lalu" +% m) $ (tanggal +% y) | egrep -v "$ (tanggal +% y) | Su" | xargs | awk '{print $ NF}') | bc
Sekarang mari kita tetapkan beberapa variabel ke 3 langkah ini. Langkah 1 Nama Variabel: FCM Langkah 2 Nama Variabel: FLM Langkah 3 Variabel NAme: DCL
Verifikasi apakah $ DCL sama dengan 0 (nol) dan hapus berdasarkan perbedaan antara $ FCM dan $ FLM:
Anda juga dapat menambahkan variabel ke "/ path / ke / folde / with / arhives /".
Kesimpulan: Jika Anda ingin menghapus file yang lebih lama dari satu bulan (tepatnya), Anda perlu menyesuaikan jumlah hari yang tepat, jika Anda menggunakan perintah "date" dan "+1 month ago".
sumber