60.8.1. Porovnání datumů/časů

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.