タイムゾーン情報

タイムゾーン情報

特定の形式のファイル修正時間を知りたいです。
どうすればいいですか?
私は知っています

stat -c %x find.txt

しかし、次の形式が必要です。

yyyymmddhh24miss

重要な場合kshLinux 2.6.18-406.el5 x86_64

答え1

GNUツールの使用:

find file -prune -printf '%TY%Tm%Td%TH%TM%TS\n'

または

date -r file +%Y%m%d%H%M%S.%N

(ただし、シンボリックリンクの場合は修正時間が表示されます。ターゲットシンボリックリンク自体ではなくシンボリックリンクの時間(これはおそらくシンボリックリンクのランタイムに興味がある人と同じです。同じタスクの-L実行を参照)。find

あなたkshが組み込み機能を有効にして構築したksh93場合:date

command /opt/ast/bin/date -m -f %Y%m%d%H%M%S.%N file

command /opt/ast/bin/date呼び出しは、前に追加すると名前で呼び出されたときに自動的に呼び出される組み込みdate関数にバインドされます。)/opt/ast/bin/date/opt/ast/bin$PATH

少数の部分を気にしない場合は、または.%Nを削除してにfind置き換えてください。%TS%.2TS

時間は現在のタイムゾーンに基づいて表示されます。この日付形式にはUTCオフセットが含まれていないため、あいまいにすることができます。たとえば、英国本土のタイムゾーンでは、次のようになります。

$ date -r file1
Sun 30 Oct 01:00:00 BST 2016
$ date -r file2
Sun 30 Oct 01:00:00 GMT 2016

両方のファイルは3600秒間隔で修正されました。 1つは冬時間に変更される前で、もう1つは冬時間に変更された後でした。しかし、それでも壁時計の時間は同じです(時計が時間間隔から1時間後に移動したため)。

$ find file? -prune -printf '%TY%Tm%Td%TH%TM%TS\n'
20161030010000.0000000000
20161030010000.0000000000

明確な時間を得るためにUTCオフセットを含めることができます。

$ find file? -prune -printf '%TY%Tm%Td%TH%TM%TS%Tz\n'
20161030010000.0000000000+0100
20161030010000.0000000000+0000

またはUTC時間が与えられた場合:

$ TZ=UTC0 find file? -prune -printf '%TY%Tm%Td%TH%TM%TS\n'
20161030000000.0000000000
20161030010000.0000000000

答え2

次のようなものを使用できます。

/bin/date +%Y%m%d%H%M%S -d "$(/usr/bin/stat -c %x find.txt)"

答え3

文書改訂する時刻は日付形式で指定できます。

$ date -d @"$(stat -c %Y file1)" +'%Y%m%d%H%M%S'

%X最後のアクセス時間と%Z最後の変更に使用されます。

%Xただし%Y、およびの最大解像度%Zは秒です。
ナノ秒分解能の場合と%xオプションを使用してください。%y%z

$ date -d "$(stat -c %y file1)" +'%Y%m%d%H%M%S.%N'
20151101020000.012345678

すでに日付を操作しているので、-r日付オプションを使用して単純化したり、findのフォーマットされた出力を使用したりできます。

$ date -r file1 +'%Y%m%d%H%M%S%z'
20151101010000-0500
$ find file1 -printf '%TY%Tm%Td%TH%TM%2.2TS%Tz\n'
20151101010000-0500

上記のコマンドの解像度は秒です。ナノ秒が必要な場合:

$ date -r file1 +'%Y%m%d%H%M%S.%N%z'
20151101010000.012345678-0500
$ find file1 -printf '%TY%Tm%Td%TH%TM%TS%Tz\n'
20151101010000.0123456780-0500

これら2つのコマンドは修正時間を提供します。
日付では、この-rオプションを使用してアクセスまたはステータス時間を取得することはできません。
照会中:接続時間%Tを%Aに変更、状態変更時間%Cを%Cに変更


タイムゾーン情報

上記のすべてのコマンドは、使用されたタイムゾーンの影響を受けます。

$ date -r file1 +'%Y%m%d%H%M%S.%N%z'
20151101010000.012345678
$ TZ=GMT0 date -r file1 +'%Y%m%d%H%M%S.%N%z'
20151101060000.012345678

時間はからに01変わります06。これは、使用しているコンピュータのタイムゾーンがに設定されているために発生しますAmerica/New_York。時間がGMT0オフセット(またはGMTOR)として計算されると、その値は5時間増加しますGMT+0GMT-0

また、現地時間値(不完全な場合)を使用すると、実際には異なりますが、同じ値をレンダリングできます。

$ date -r file1 +'%Y%m%d%H%M%S.%N'; date -r file2 +'%Y%m%d%H%M%S.%N'
20151101010000.012345678
20151101010000.012345678

%zこれがまさにテーリングが必要な理由だ。地元の頻度:

$ date -r file1 +'%Y%m%d%H%M%S.%N%z'; date -r file2 +'%Y%m%d%H%M%S.%N%z'
20151101010000.012345678-0500
20151101010000.012345678-0400

これにより値が異なります。ただし、この形式は年代順の並べ替えを困難にします。これはGMT時間オフセット(%z)が常に0あり、省略される可能性があるため、最善の解決策は時間を使用することです。

$ ( TZ=GMT0; date -r file1 +'%Y%m%d%H%M%S.%N'; date -r file2 +'%Y%m%d%H%M%S.%N')
20151101060000.012345678
20151101050000.012345678

そして並べ替えも可能です。

[1]タッチに使用するファイルの値です。
touch -m -d '20151101 01:00:00.012345678-05' file1
touch -a -d '20151101 01:00:00.987654321-05' file1
touch -m -d 01 04 'file2
touch - a -d '20151101 01:00:00.987654321-04'ファイル2

関連情報