La utilidad de fecha de FreeBSD -r switch me confunde

La utilidad de fecha de FreeBSD -r switch me confunde

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 -rse 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 -rconmutador 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 -rcambio. 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 -rinterruptor quiero usar aquí?

Respuesta1

Parece que este -ruso 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 datecomando analiza sus líneas de comando getopt()y las opciones deben preceder estrictamente a los argumentos. La cadena de formato +%des un argumento y debe seguir a la -ropción; de lo contrario -rno 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 datepágina del manual los muestra en este mismo orden.

Sí, datetrata los argumentos de las opciones -rcomo 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 statcomando... 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

información relacionada