Utilitário de data do FreeBSD -r switch me confunde

Utilitário de data do FreeBSD -r switch me confunde

Eu tenho um script bash que preciso converter do Linux para o FreeBSD, mas obviamente sou estúpido demais para ler a página de manual da maneira adequada.

O script tem uma linha ao longo:

date +%d -r "$file"

que funciona bem no Linux, mas apenas fornece

date: illegal time format

no FreeBSD.

Opágina de manual do linuxdiz que -ré usado para especificar o arquivo de referência:

   -r, --reference=FILE
          display the last modification time of FILE

O que me intriga aqui é que oPágina de manual do FreeBSDcontém o mesmo uso para esta opção, mas também fornece uma alternativa:

 -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, as mensagens de erro acima resultam da expectativa de um carimbo de data/hora UNIX como parâmetro para o -rswitch, em vez do nome de arquivo fornecido.

O que não entendo é como devo deixar claro que quero usar a segunda interpretação da -ropção. Se for deduzido do contexto da chamada, estou confuso sobre como fornecer esse contexto.

Alguém pode me explicar como devo informar ao utilitário de data qual caso de uso do -rswitch desejo usar aqui?

Responder1

Parece que esse -ruso só apareceu nas fontes em7 de maio de 2015. Talvez sua versão ainda não faça isso?

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.

Responder2

O script tem uma linha ao longo:

data +%d -r "$arquivo"
que funciona bem no Linux, mas…

… no FreeBSD/PC-BSD falhará porque o datecomando analisa suas linhas de comando com getopt()e as opções devem preceder estritamente os argumentos. A string de formato +%dé um argumento e deve seguir a -ropção; caso contrário, -rnão é reconhecido como uma opção, mas é tratado como um argumento (inválido). Observe que a sinopse do comando na datepágina do manual os exibe nesta mesma ordem.

Sim, datetrata os argumentos das opções -rcomo nomes de arquivos apenas quando não pode decodificá-los como números. Sim, isso é um problema quando os nomes dos arquivos são números. ☺

Uma abordagem melhor para ler a hora da última modificação de um arquivo/diretório, sem se preocupar se seu nome se assemelha a um número ou não, seria o statcomando… se isso não tivesse dificuldades significativas.

caso "`uname`" em
Linux)stat -c '%y' -- "$1"|cut -c9-10 ;;
*BSD)stat -f '%Sm' -t '%d' -- "$1" ;;
esac

informação relacionada