特定の形式でファイルの変更時刻を取得したい。
どうやってやるの ?
知っている
stat -c %x find.txt
しかし、私はこの形式が必要です:
yyyymmddhh24miss
必要に応じて、Linux 2.6.18-406.el5 x86_64
でksh
を使用しています。
あなたは次のようなものを使うことができます:
/bin/date +%Y%m%d%H%M%S -d "$(/usr/bin/stat -c %x find.txt)"
GNUツール:
find file -Prune -printf '%TY%Tm%Td%TH%TM%TS\n'
または
date -r file +%Y%m%d%H%M%S.%N
(ただし、シンボリックリンクの場合は、シンボリックリンク自体ではなく、シンボリックリンクのtargetの変更時間を表示することに注意してください(シンボリックリンクのmtimeに関心があるのと同様に、-L
with find
with the same))).
ksh
がksh93
であり、date
ビルトインを有効にしてビルドされている場合:
command /opt/ast/bin/date -m -f %Y%m%d%H%M%S.%N file
(command /opt/ast/bin/date
は、/opt/ast/bin/date
にバインドされた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
これらの2つのファイルの変更時刻は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
ファイルmodification時間は、日付でフォーマットできます:
$ 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に変更します
上記のすべてのコマンドは、使用されるタイムゾーンの影響を受けることに注意してください。
$ 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
オフセット(別名GMT
またはGMT+0
またはGMT-0
)で計算すると、その値は5時間で増加します。
また、ローカル時刻の値を使用すると(不完全な場合)、実際には異なる場合でも同じ値が表示されることがあります。
$ date -r file1 +'%Y%m%d%H%M%S.%N'; date -r file2 +'%Y%m%d%H%M%S.%N'
20151101010000.012345678
20151101010000.012345678
そのため、local回、テーリング%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
これにより、値が異なります。ただし、この種類の形式では、時間による並べ替えが困難になります。タイムオフセット(%z
)は常に0
であり、省略できるため、GMT
回を使用するのが最善の解決策です。
$ ( 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 '20151101 01:00:00.012345678-04' file2
touch -a -d '20151101 01:00:00.987654321-04' file2