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ší."
fiMož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.