ファイルへの参照を使用して以前の日付を取得するには、dateコマンドをどのように使用しますか?

ファイルへの参照を使用して以前の日付を取得するには、dateコマンドをどのように使用しますか?

参照ファイルの前の日付を取得しようとしています。

私が試したこと:

[rahul@testsrv]$ date +%F -r /tmp/ftpbkp.log
2013-08-27

[rahul@testsrv]$ date +%F -r /tmp/ftpbkp.log -d "1 day ago"
date: the options to specify dates for printing are mutually exclusive
Try `date --help' for more information.

答え1

警告指示:

$ date -r ~/a
Sun 28 Oct 23:12:00 GMT 2012
$ LC_ALL=C date -r ~/a
Sun Oct 28 23:12:00 GMT 2012

出力としてdateユーザーのデフォルト形式で日付を出力します。しかし、-dGNUの入力はdate書式設定の方が難しいです。

$ date -d "$(date -r ~/a) - 1 day"
date: invalid date ‘Sun 28 Oct 23:12:00 GMT 2012 - 1 day’

ロケールをCに変更すると問題が解決します。

$ export LC_ALL=C
$ date -d "$(date -r ~/a) - 1 day"
Sun Oct 28 00:12:00 BST 2012

しかし、夏時間の制約にもかかわらず、日付はまだ2012年10月28日です。その理由は、イギリスではその日までに24時間が残っていますが、まだ同じ日だからです。

さて、前日が欲しいなら、次のように書く必要があります。

date -d "$(date -r /tmp/file.ref +'%F -1 day')" +%F

答え2

LC_ALL=C date -d "$(LC_ALL=C date -r /tmp/ftpbkp.log) - 1 day" +%F

もしGNU日付なし:

perl -MPOSIX -le'
  print strftime("%Y-%m-%d", localtime +(stat shift)[9] - 24*60*60)
  ' /tmp/ftpbkp.log

答え3

date -r /tmp/ftpbkp.log +%s | awk '{print strftime("%F", $1 - (24*60*60) );}'

答え4

この-dオプションは、現在時刻と異なる時刻を指定するために使用されます。形式に応じてファイルの最後の変更時刻の形式を指定するようにコマンドを要求し、dateオプションで指定された他の時間も渡しました。これらのオプションは相互に排他的です。しかし、これを組み合わせる方法には次のようなコツがあります。/tmp/ftpbkp.log%F-d

date -d "`date -r /tmp/ftpbkp.log`" - 1 day"

関連情報