Considerando que você está usando o stat
(funcionalidade semelhante, mas formato de saída diferente em BSDs e GNU), você também pode usar o utilitário test
, que faz essa comparação diretamente:
FILE1 -nt FILE2
FILE1 is newer (modification date) than FILE2
FILE1 -ot FILE2
FILE1 is older than FILE2
No seu exemplo,
if [ "$source_file" -nt "$target_file" ]
then
printf '%s\n' "$source_file is newer than $target_file"
fi
O recurso não está disponível no POSIX (consulte a documentação para test
), que fornece como uma razão:
Some additional primaries newly invented or from the KornShell appeared in an early proposal as part of the conditional command ([[]]): s1
>
s2, s1<
s2, str = pattern, str != pattern, f1-nt
f2, f1-ot
f2, and f1 -ef f2. They were not carried forward into the test utility when the conditional command was removed from the shell because they have not been included in the test utility built into historical implementations of the sh utility.
Isso pode mudar no futuro, embora , como o recurso é amplamente suportado.
Note que quando os operandos são links simbólicos, é a hora da modificação do destino do symlink que é considerado (que é geralmente o que você quer, use find -newer
se não). Quando links simbólicos não podem ser resolvidos, o comportamento entre implementações (alguns consideram um arquivo existente como sempre mais novo que um que não pode resolver, alguns sempre reportarão falso se algum dos operandos não puder ser resolvido) .
Observe também que nem todas as implementações suportam granularidade abaixo de segundo ( bash
' test
/ [
incorporado na versão 4.4 ainda não inclui, por exemplo, GNU test
e test
incorporado zsh
ou ksh93
do, pelo menos no GNU / Linux).
Para referência:
- Para a implementação do utilitário GNU
test
(mas observe que seu shell, sefish
ou Bourne-like, também terá umtest
/[
integrado que normalmente faz sombras, useenv test
em vez detest
para ignorá-lo), get_mtime em teste. c lêstruct timespec
e -
a opção
-nt
usa esses dados