
Linux から FreeBSD に変換する必要がある bash スクリプトがありますが、明らかに私はあまりにも愚かなので、マニュアル ページを適切に読むことができません。
スクリプトには次の行があります:
date +%d -r "$file"
Linuxでは問題なく動作しますが、
date: illegal time format
FreeBSD 上で。
のLinux マニュアルページ-r
参照ファイルを指定するために使用されると書かれています:
-r, --reference=FILE
display the last modification time of FILE
ここで私が困惑しているのは、FreeBSD マニュアルページこのスイッチの同じ使用法が含まれていますが、別の使用法も提供されています。
-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.
-r
明らかに、上記のエラー メッセージは、提供されたファイル名ではなく、スイッチのパラメーターとして UNIX タイムスタンプが期待されていることから生じています。
私が理解できないのは、-r
スイッチの 2 番目の解釈を使用したいことをどのように明確にすればよいかということです。呼び出しのコンテキストから推測する必要がある場合、このコンテキストをどのように提供すればよいのかわかりません。
-r
ここで使用したいスイッチの使用例を日付ユーティリティに伝えるにはどうすればよいのか、誰か説明してもらえませんか?
答え1
この-r
用法は、2015年5月7日おそらく、あなたのバージョンではこれがまだ実行されていないのでしょうか?
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.
答え2
スクリプトには次の行があります:
日付 +%d -r "$file"Linux では問題なく動作しますが…
… FreeBSD/PC-BSD では、date
コマンドがコマンドラインを解析しgetopt()
、オプションが引数の前に厳密に置かれる必要があるため、失敗します。フォーマット文字列は+%d
引数であり、-r
オプションの後に続く必要があります。そうでない場合は、-r
オプションとして認識されず、(無効な)引数として扱われます。マニュアル ページのコマンド概要では、date
これらがこの順序で表示されることに注意してください。
はい、date
オプション引数を-r
数値としてデコードできない場合にのみファイル名として扱います。はい、ファイル名が数値の場合、これは問題になります。☺
ファイル/ディレクトリの名前が数字に似ているかどうかを気にせずに、ファイル/ディレクトリの最終変更時刻を読み取るためのより良い方法は、コマンドを使用することですstat
...ただし、それ自体に大きな問題はありません。
case "`uname`" の場合 Linux) stat -c '%y' -- "$1"|cut -c9-10 ;; *BSD) stat -f '%Sm' -t '%d' -- "$1" ;; エサック