El incorporado test
y las [
utilidades tienen las pruebas -nt
("más nuevo que") y -ot
("más antiguo que") en la mayoría de los shells, incluso cuando el shell se ejecuta en "modo POSIX" (también es cierto para las utilidades externas de los mismos nombres en el sistemas a los que tengo acceso). Estas pruebas son para comparar marcas de tiempo de modificación en dos archivos. Su semántica documentada varía ligeramente entre las implementaciones (con respecto a lo que sucede si uno u otro archivo existe o no), pero no están incluidos en la especificación POSIX. para la test
utilidad .
No se
test
transfirieron a la utilidad cuando el comando condicional se eliminó del shell [KornShell] porque no se han incluido en latest
utilidad integrada en implementaciones históricas de lash
utilidad.
Suponiendo que me gustaría comparar la marca de tiempo de modificación entre archivos en un /bin/sh
script de shell y luego tomar medidas dependiendo de si un archivo es más nuevo que el otro, como en
if [ "$sigfile" -nt "$timestamp" ] ||
[ "$sigfile.tmp" -nt "$timestamp" ]
then
return
fi
... ¿qué otra utilidad podría usar, aparte de make
(lo que haría que el resto del script sea difícil de manejar por decir lo menos)? ¿O debería suponer que nadie ejecutará el script en una "implementación histórica de sh
", o renunciar a escribir para un shell específico como bash
?
fuente
-nt
función de latest
forma esperada ya que aprox. 1995. Debe usar lafind
expresión basd incluso conbash
si le gusta el comportamiento correcto.Respuestas:
POSIXLY:
El uso de la ruta absoluta a los archivos evita que un falso positivo con nombre de archivo contenga solo nuevas líneas.
En caso de utilizar la ruta relativa, cambie el
find
comando a:fuente
$f1
solo contiene nuevas líneas;)-exec echo x \;
o similar?-printf
sería fácil si fuera estándarfind
El estado de salida de @Kusalananda AFAICT es independiente de las pruebas individuales defind
retorno, excepto quizás si hay un error al ejecutar esas pruebas.find
sale de 0 incluso si no se encuentran archivos.[ / -nt /nofile ]
varía con la implementación (pero nunca genera ningún error).Esto podría ser un caso para el uso de uno de los comandos más antigua Unix,
ls
.El resultado es verdadero si a es más nuevo que b.
fuente
-
(falta--
). Necesitarías-L
que sea equivalente a-nt
. Eso no funciona para compararx
y,$'x\nx'
por ejemplo.Planteó una pregunta interesante e hizo un reclamo que primero debe verificarse.
Verifiqué el comportamiento de:
Con varias conchas. Aquí están los resultados:
bash no funciona: no imprime nada.
Bosh trabaja
el guión no funciona: no imprime nada.
ksh88 no funciona, no imprime nada.
ksh93 funciona
mksh no funciona, no imprime nada.
impresiones elegantes : elegante: [: -nt: operador / operando inesperado
yash funciona
zsh funciona en versiones más nuevas , las versiones anteriores no imprimen nada
Entonces, cuatro de nueve shells admiten la característica -nt y la implementan correctamente. Correctamente en este caso significa: es capaz de comparar marcas de tiempo en plataformas recientes que admiten granularidad de marcas de tiempo por debajo del segundo . Tenga en cuenta que los archivos que seleccioné difieren típicamente solo unos pocos microsegundos en sus marcas de tiempo.
Como es más fácil encontrar una
find
implementación que funcione , recomiendo reemplazarpor una
find
expresión basada.funciona al menos mientras
$file1
no solo contenga nuevas líneas.es un poco más lento pero funciona correctamente.
Por cierto: con respecto a make, no puedo hablar de todas las implementaciones de make, pero
SunPro Make
admite la comparación de tiempo con la granularidad de nanosegundos desde aprox. 20 años, mientras quesmake
ygmake
agregó esta característica recientemente.fuente
find
implementaciones como busybox o heirloom-toolchest tendrán la misma limitación.-L
lafind
versión sea equivalente a-nt
. También fallaría en los nombres de archivo que comienzan con-
o!
,(
...find
tienenfind -f "$file"
para eso, pero no es portátil.