Nie jestem pewien, czy ta data minie w ciągu bieżącego dnia, czy też zajmie to tylko 30 lub 31 dni.
na przykład
Jeśli aktualna data to March 28th
1 miesiąc, musi być February 28th
, ale co się stanie, kiedy będzie March 30th
?
Scenariusz
Chcę tworzyć kopie zapasowe niektórych plików każdego dnia, skrypt zapisze te pliki w bieżącej dacie w $(date +%Y%m%d)
formacie, np. 20150603_bckp.tar.gz
Kiedy nadejdzie następny miesiąc, usuń wszystkie te pliki w ciągu 1 miesiąca z wyjątkiem plików 1. i 15., więc jest to moja kondycja:
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
Ale chcę wiedzieć, co się stanie, gdy data przypada na 30, 31, a nawet ostatni przykład z lutego? Zachowa te pliki? lub usunąć pliki pierwszego dnia?
Kiedy będzie 31. wydalanie zostanie wykonane, więc jeśli miniony miesiąc miał tylko 30 dni, spowoduje to usunięcie pliku pierwszego dnia?
Mam nadzieję, że podpowiedziałem.
Odpowiedzi:
- 1 month
odejmie jeden od numeru miesiąca, a następnie, jeśli wynikowa data jest niepoprawna (February 30
na przykład), dostosuj ją, aby była poprawna. TakDecember 31 - 1 month
jestDecember 1
, nie ma dnia, w listopadzie, aMarch 31 - 1 month
jestMarch 3
(chyba stracony w roku przestępnym).Oto cytat ze strony informacyjnej Gnu
date
(która jestdate
wersją, która implementuje tę składnię), która zawiera dobrą sugestię, aby uczynić arytmetykę bardziej niezawodną:Kolejne ostrzeżenie, również cytowane ze strony informacyjnej:
źródło
date
wdrożenia; w mojej książce jest semantycznie sprzeczna z intuicją. - Dzięki za zwrócenie na to uwagi, dobrze wiedzieć.Zamiast polegać na nazwach plików podczas usuwania plików kopii zapasowych, bezpieczniej byłoby polegać na ich metadanych dotyczących czasu.
Na przykład możesz usunąć wszystkie pliki starsze niż 30 dni za pomocą tego polecenia:
Jako darmowy bonus, codzienne uruchamianie pozwoli ci zachować ciągłe tworzenie kopii zapasowych, co pozwoli na lepsze zarządzanie miejscem na dysku.
Aby zachować 1 lub 15 plik, możesz albo przechowywać je w innym katalogu, albo zaktualizować polecenie find opcją -not -name.
źródło
Możesz spróbować zobaczyć, jak działa data, wykonując następujące czynności:
Myślę więc, że na podstawie aktualnego miesiąca z poprzedniego miesiąca (nie aktualnego, jeśli to marzec), zmniejsza liczbę dni od ostatniego miesiąca od bieżącego miesiąca.
Możesz wypróbować następującą składnię, aby usunąć pliki starsze niż kilka dni (w przykładzie poniżej 31 dni). Jedna linia do rozwiązania problemu (jest to proste podejście).
Aby uzyskać bardziej szczegółowe podejście, możesz również zrobić coś takiego: 1. Znajdowanie liczby dni dla bieżącego miesiąca:
Znajdowanie liczby dni w ostatnim miesiącu:
echo "$ (cal $ (data +% m) $ (data +% y) | egrep -v" $ (data +% y) | Su "| xargs | awk '{print $ NF}') -" $ ( cal $ (data -d "+1 miesiąc temu" +% m) $ (data +% y) | egrep -v "$ (data +% y) | Su" | xargs | awk '{print $ NF}') | pne
Teraz widzimy różnicę między tymi dwoma miesiącami:
echo "$ (cal $ (data +% m) $ (data +% y) | egrep -v" $ (data +% y) | Su "| xargs | awk '{print $ NF}') -" $ ( cal $ (data -d "+1 miesiąc temu" +% m) $ (data +% y) | egrep -v "$ (data +% y) | Su" | xargs | awk '{print $ NF}') | pne
Teraz możemy przypisać niektóre zmienne do tych 3 kroków. Krok 1 Nazwa zmiennej: FCM Krok 2 Nazwa zmiennej: FLM Krok 3 Nazwa zmiennej: DCL
Sprawdź, czy $ DCL wynosi 0 (zero) i usuń na podstawie różnicy między $ FCM i $ FLM:
Możesz także dodać zmienną do „/ path / to / folde / with / arhives /”.
Wniosek: jeśli chcesz usunąć pliki starsze niż miesiąc (dokładnie), musisz dostosować dokładną liczbę dni, jeśli używasz polecenia „data” i „+1 miesiąc temu”.
źródło