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

0

Eu tenho um script bash que eu preciso converter do linux para o FreeBSD, mas eu sou obviamente muito estúpido para ler a página de manual de uma maneira apropriada.

O script tem uma linha ao longo:

date +%d -r "$file"

que funciona bem no linux, mas apenas dá

date: illegal time format

no FreeBSD.

A página de manual do linux diz que -r é usado para especificar a referencia arquivo:

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

O que me intriga aqui, é que a página de manual do FreeBSD contém o mesmo uso para este switch, mas também fornece um 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, as mensagens de erro acima resultam da expectativa de um timestamp do UNIX como parâmetro para a opção -r em vez do nome do arquivo fornecido.

O que não entendo é como devo deixar claro que desejo usar a segunda interpretação da opção -r . Se é suposto ser deduzido do contexto da chamada, estou confuso sobre como fornecer este contexto.

Alguém pode me explicar, como devo dizer ao utilitário de data, que usa o caso da opção -r que eu quero usar aqui?

    
por s1lv3r 17.05.2016 / 13:14

2 respostas

2

Parece que o uso de -r só foi incluído nas fontes em 7 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.
    
por 17.05.2016 / 13:38
2

The script has a line along:

date +%d -r "$file"
which works fine under linux, but …

… no FreeBSD / PC-BSD falhará porque o comando date 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 opção -r ; caso contrário, -r não é reconhecido como uma opção, mas tratado como um argumento (inválido). Observe que a sinopse do comando na página de manual date exibe-os nesta mesma ordem.

Sim, date trata os argumentos da opção como -r como 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 assemelhava a um número ou não, seria o comando stat ... não tinha dificuldades significativas.

case "'uname'" in
Linux) stat -c '%y' -- "$1"|cut -c9-10 ;;
*BSD) stat -f '%Sm' -t '%d' -- "$1" ;;
esac
    
por 17.05.2016 / 16:57