
Tengo un script bash que necesito convertir de Linux a FreeBSD, pero obviamente soy demasiado estúpido para leer la página de manual de forma adecuada.
El guión tiene una línea que dice:
date +%d -r "$file"
que funciona bien en Linux, pero solo da
date: illegal time format
en FreeBSD.
Elpágina de manual de Linuxdice que -r
se utiliza para especificar el archivo de referencia:
-r, --reference=FILE
display the last modification time of FILE
Lo que me desconcierta aquí es que elPágina de manual de FreeBSDcontiene el mismo uso para este modificador, pero también proporciona uno alternativo:
-r seconds
Print the date and time represented by seconds, where seconds is
the number of seconds since the Epoch (00:00:00 UTC, January 1,
1970; see time(3)), and can be specified in decimal, octal, or
hex.
-r filename
Print the date and time of the last modification of filename.
Obviamente, los mensajes de error anteriores se deben a la expectativa de una marca de tiempo UNIX como parámetro para el -r
conmutador en lugar del nombre de archivo proporcionado.
Lo que no entiendo es cómo se supone que debo dejar claro que quiero utilizar la segunda interpretación del -r
cambio. Si se supone que debe deducirse del contexto de la llamada, no sé cómo proporcionar este contexto.
¿Alguien puede explicarme cómo se supone que debo decirle a la utilidad de fecha qué caso de uso del -r
interruptor quiero usar aquí?
Respuesta1
Parece que este -r
uso solo llegó a las fuentes en7 de mayo de 2015. ¿Quizás tu versión aún no hace esto?
Revision 282608 - (view) (download) (annotate) - [select for diffs]
Modified Thu May 7 20:54:38 2015 UTC (12 months, 1 week ago) by delphij
date(1): Make -r behave like GNU's version when the option can not be
interpreted as a number, which checks the file's modification time and
use that as the date/time value.
Respuesta2
El guión tiene una línea que dice:
fecha +%d -r "$archivo"que funciona bien en Linux, pero...
… en FreeBSD/PC-BSD fallará porque el date
comando analiza sus líneas de comando getopt()
y las opciones deben preceder estrictamente a los argumentos. La cadena de formato +%d
es un argumento y debe seguir a la -r
opción; de lo contrario -r
no se reconoce como una opción, sino que se trata como un argumento (no válido). Tenga en cuenta que la sinopsis de los comandos en la date
página del manual los muestra en este mismo orden.
Sí, date
trata los argumentos de las opciones -r
como nombres de archivos solo cuando no puede decodificarlos como números. Sí, esto es un problema cuando los nombres de archivos son números. ☺
Un mejor enfoque para leer la hora de la última modificación de un archivo/directorio, sin preocuparse de si su nombre se parece a un número o no, sería el stat
comando... si no tuviera dificultades propias importantes.
caso "`uname`" en Linux) estadística -c '%y' -- "$1"|cut -c9-10 ;; *BSD) estadística -f '%Sm' -t '%d' -- "$1" ;; esac