Tedy zjištění v jakém vzájmeném vztahu jsou dva datumy. Tedy který je nižší (starší) a který vyšší (mladší). Pro tento úkol se nabízejí dvě cesty řešení.
Program test a jeho zabudovaný eqvivalent v bashi má možnost porovnávat dva soubory podle data poslední modifikace. Jedná se parametry -nt
a -ot
zabudovaného porgramu test.
if [ file1 -nt file2 ]; then … fi
Pokud časy které potřebujeme porovnávat jsou časy modifikace souborů, můžeme přímo použít program test.
if [ file1 -nt file2 ]; then echo "Soubor file1 je mladší a soubor file2 je starší." else echo "Soubor file1 je starší a soubor file2 je mladší." fi
Možnosti které nám tato srovná umožňují ukazuje názorně následující program. Experimentujte s prvním parametrem a sledujte jak se chová.
#!/bin/sh case $1 in 1) touch file1 file2;; 2) touch file1; sleep 1s; touch file2;; 3) touch file2; sleep 1s; touch file1;; *) echo "zadej parametr 1, 2 nebo 3"; exit 1;; esac ls -l file[12] if [ file1 -nt file2 ]; then echo "čas_modifikace(file1) > čas_modifikace(file2)" else echo "čas_modifikace(file1) <= čas_modifikace(file2)" fi if [ file1 -ot file2 ]; then echo "čas_modifikace(file1) < čas_modifikace(file2)" else echo "čas_modifikace(file1) >= čas_modifikace(file2)" fi if ! [ file1 -nt file2 ] && ! [ file1 -ot file2 ]; then echo "Oba soubory jsou stejně staré." fi rm file[12]
Pokud máme čas/datum v řetězci a nejedná se o datum modifikace souboru, pomůžeme si malým trikem za použití programu touch. Tento program umí vytvořit soubor s uvedeným datem modifikace.
touch -d "2007-08-13 18:08:53" /tmp/$$.ts1 touch -d "2007-08-13 18:09:07" /tmp/$$.ts2 … if [ /tmp/$$.ts1 -nt /tmp/$$.ts2 ]; then … fi … rm /tmp/$$.*
V uvedeném příkladu vytváříme soubory v adresáři /tmp
a a do jejich jména zahrnujeme číslo procesu ($$
). Činíme tak proto, aby při běhu víve programů využívající této technologie srovnání času nedocházelo ke kolizím na jménech souborů.
Dalším možným způsobem jak porovnávat data a časy je porovnávat jejich textové reprezentace. Zde z výhodou využijeme programu date, který dovoluje námi stanovené datum formátovat potřebným způsobem.
date1=$(date -d "2007-08-13 18:17:11" +%F_%T) date2=$(date -d "2 days ago" +%F_%T) … if [[ $date1 < $date2 ]]; then … fi
Tento způsob má oproti předchozímu dvě podstatné výhody.
+%F_%T
, +%F
, +%T
, … dosáhneme sofistikovanějšího porvnání například jen podle data či jen podle času. Můžeme porovnávat například i podle dne v týdnu.