Eu quero verificar se o link lnkfile
é mais antigo que um arquivo de referência regular reffile
.
O bash test
builtin desreferencia links, portanto, test lnkfile -ot reffile
compara o destino de lnkfile
, não o próprio link.
Existe uma maneira de fazer com que o test
builtin não siga links simbólicos? Caso contrário, como posso comparar o tempo de um link simbólico?
Até onde eu sei, o bash não oferece nenhuma versão
-ot
(e similares) que evite desreferenciar links simbólicos.O que você pode fazer é usar GNU stat (que não desreferencia links simbólicos sem
-L
) e comparar suas épocas mtime numericamente:Eu não acho que haja uma maneira com
test
, mas você pode usarfind
.Aqui,
find
retorna a saída selnkfile
for mais antiga quereffile
.test
sem uma opção é equivalente atest -n
. Isso é verdade se o comprimento da string for diferente de zero. Portanto, se houver saída defind
,command
será executado.Nos comentários, me pediram para fazer uma comparação desta solução vs.
stat
. Em primeiro lugar, acho astat
abordagem perfeitamente boa.Fiz um benchmark para comparar. Repeti o teste algumas vezes, alternando, e obtive resultados semelhantes.
Parece que
find
é quase duas vezes mais rápido, talvez porque seja um único processo em vez de doisstats
? Não tenho certeza de como compará-los; por favor, comente se houver outros aspectos relevantes que você possa pensar.Aqui estão algumas outras diferenças, conforme comentários de Stéphane Chazelas abaixo:
Com
zsh
5.6 ou superior (para a precisão de nanossegundos), você pode fazer isso com built-ins apenas com:O que funcionaria independentemente de quais caracteres ou não caracteres os nomes dos arquivos contêm e compara os carimbos de data/hora até o nanossegundo.
Estamos comparando os carimbos de data e hora como strings (número de nanossegundos como uma representação decimal de string com zero de 30 dígitos) em vez de pontos flutuantes porque os pontos flutuantes de precisão dupla típicos de um PC x86_64 executando GNU/Linux pelo menos não têm o suficiente precisão para armazenar números
1548195897.775033155
assim, você não seria capaz de distinguir dois arquivos modificados hoje nos mesmos 100 nanossegundos.