Os utilitários test
e [
internos têm os testes -nt
("mais recentes que") e -ot
("mais antigos") na maioria dos shells, mesmo quando o shell está sendo executado no "modo POSIX" (também válido para os utilitários externos com os mesmos nomes no sistemas aos quais tenho acesso). Esses testes são para comparar registros de data e hora da modificação em dois arquivos. Sua semântica documentada varia ligeiramente nas implementações (com relação ao que acontece se um ou outro arquivo existir ou não), mas eles não estão incluídos na especificação POSIX. para o test
utilitário .
Eles não foram transportados para o
test
utilitário quando o comando condicional foi removido do shell [KornShell] porque não foram incluídos notest
utilitário incorporado nas implementações históricas dosh
utilitário.
Supondo que eu gostaria de comparar o carimbo de data / hora da modificação entre os arquivos em um /bin/sh
script de shell e, em seguida, executar uma ação, dependendo se um arquivo é mais recente que o outro, como em
if [ "$sigfile" -nt "$timestamp" ] ||
[ "$sigfile.tmp" -nt "$timestamp" ]
then
return
fi
... que outro utilitário eu poderia usar, além de make
(o que tornaria o restante do script pesado para dizer o mínimo)? Ou devo apenas assumir que ninguém jamais executará o script em uma "implementação histórica de sh
" ou renunciará a escrever para um shell específico como bash
?
fonte
-nt
recurso detest
uma maneira que é esperada desde aprox. 1995. Você deve usar afind
expressão basd, mesmo que combash
um comportamento correto.Respostas:
POSIXAMENTE:
O uso do caminho absoluto dos arquivos para impedir que um falso positivo com o nome do arquivo contenha apenas novas linhas.
No caso de usar o caminho relativo, altere o
find
comando para:fonte
$f1
contém apenas novas linhas;)-exec echo x \;
ou similar?-printf
Seria fácil se fosse normafind
O status de saída do @Kusalananda AFAICT é independente do que os testes individuais defind
retorno - exceto talvez se houver algum erro na execução desses testes.find
sai 0 mesmo que nenhum arquivo seja encontrado.[ / -nt /nofile ]
varia com a implementação (mas nunca gera nenhum erro).Este pode ser um caso para usar um dos comandos mais antigos do Unix
ls
,.O resultado é verdadeiro se a for mais novo que b.
fonte
-
(ausentes--
). Você precisaria-L
que fosse equivalente a-nt
. Isso não funciona para compararx
e,$'x\nx'
por exemplo.Você levantou uma pergunta interessante e fez uma reivindicação que deveria ser verificada primeiro.
Eu verifiquei o comportamento de:
com várias conchas. Aqui estão os resultados:
bash Não funciona - imprime nada.
bosh funciona
traço Não funciona - imprime nada.
ksh88 Não funciona - imprime nada.
ksh93 works
mksh Não funciona - imprime nada.
posh prints: posh: [: -nt: operador / operando inesperado
obras de yash
O zsh funciona em versões mais recentes , versões anteriores não imprimem nada
Portanto, quatro dos nove shells suportam o recurso -nt e o implementam corretamente. Corretamente, neste caso, significa: é capaz de comparar registros de data e hora em plataformas recentes que suportam granularidade de registro de hora em segundos . Observe que os arquivos que eu selecionei diferem normalmente apenas alguns microssegundos em seus carimbos de hora.
Como é mais fácil encontrar uma
find
implementação de trabalho , recomendo substituirpor uma
find
expressão baseada.funciona pelo menos desde
$file1
que não contenha apenas novas linhas.é um pouco mais lento, mas funciona corretamente.
BTW: Em relação ao make, não posso falar em todas as implementações do make, mas
SunPro Make
suporta a comparação de tempo com granularidade em nanossegundos desde aprox. 20 anos, enquantosmake
egmake
adicionou este recurso recentemente.fonte
find
implementações como busybox ou heirloom-toolchest terão a mesma limitação.-L
que afind
versão fosse equivalente a-nt
. Seria também falhar em nomes de arquivos que começam com-
ou!
,(
...find
têmfind -f "$file"
isso, mas não é portátil.