web-dev-qa-db-ja.com

特定の形式でファイルの変更時刻を取得します(yyyymmddhh24miss)

特定の形式でファイルの変更時刻を取得したい。
どうやってやるの ?
知っている

stat -c %x find.txt

しかし、私はこの形式が必要です:

yyyymmddhh24miss

必要に応じて、Linux 2.6.18-406.el5 x86_64kshを使用しています。

4
ANOUK_prog

あなたは次のようなものを使うことができます:

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

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))).

kshksh93であり、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
4

ファイル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

1
user79743