完全なファイル日付(GNUユーティリティを除く)

完全なファイル日付(GNUユーティリティを除く)

別のプログラムに渡すために、特定のファイルの完全な日付(生成または変更)を取得しようとしています。さまざまなオプションでlsコマンドを試しましたが、どちらも6ヶ月未満のファイルの完全な日付を提供しておらず、これらのオプションの使用に制限があります。この問題を調査するためにいくつかのオプションを試してみると、次のメッセージが表示されます。

usage: ls [-1ACFHLNRabcdefgilmnopqrstuxEUX] [File...]

私が知っている限り、これらのどれも私が必要とするものを提供していないようで、statコマンドを使ってみましたが、うまくいきませんでした。

私はAIX 5.3でKornシェルを使用しており、使用可能なコマンドが制限されています。ファイルの作成または変更日を完全な日付(dd / mm / yyyyまたはyyyy / mm /)で取得する他の方法を提案できる人はいますか? dd))。

答え1

を使えばls常に得られるわけではありませんが、時間、あなたは推論できる必要があります日付(年月日)。

Cロケールでは、日付出力は最新のファイルのものでなければls -lなりませんMmm dd HH:MM(そして年(今年または前年))をエクスポートすることができなければならないか、古いMmm dd YYYYファイルまたは将来の修正時刻を持つファイルのものでなければなりません。 mm-dd)からエクスポートできる必要があります。

eval "$(date +'year=%Y month=%m')"
LC_ALL=C ls -dln file | awk -v y="$year" -v m="$month" '{
  month = index("--JanFebMarAprMayJunJulAugSepOctNovDec", $6) / 3
  day = $7
  if ($8 ~ /:/)
    year = y - (month > m)
  else
    year = $8
  printf "%04d-%02d-%02d\n", year, month, day
  exit}'

今、最高の精度で完全な修正時間が必要な場合は、標準コマンドがないのが残念です。

lsそのオプションを含むいくつかの実装を見つけることができます(例:ls --full-timeGNUls-D <format>FreeBSDを使用)。ls

statこの機能を提供できるさまざまな互換性のないコマンド実装(IRIX、zsh組み込み、GNU、BSD)があります。

-printfまたは、GNU述語を使用することもできますfind。または-rGNUオプションdate

すべての実装が1秒未満の粒度を提供するわけではありません。指定された出力はあいまいで、選択した形式と現在のタイムゾーンに応じて複数の日付を参照できるため、タイムゾーンとDSTに注意してください。

シンボリックリンクの場合は、リンクまたはターゲットの修正時刻であるかどうかを自分で尋ねることもできます。ここに記載されているオプションのいくつかは基本的にこれらのいずれかを実行し、一部は必要に応じてそれらのいずれかを実行するように指示できます。

  • zsh統計: stat -F '%Y-%m-%d %T.%N %z' +mtime file
    1992-05-13 14:57:00.123368710 +0100
  • GNU statstat -c %y file
    1992-05-13 14:57:00.123368710 +0100
  • BSD statstat -t '%F %T %z' -f %Sm file
    1992-05-13 14:57:00 +0100
  • アイリックスstatstat -m file
  • GNU findfind file -prune -printf '%TF %TT %Tz\n'
    1992-05-13 14:57:00.1233687100 +0100
  • GNU datedate -r file '+%F %T.%N %z'
    1992-05-13 14:57:00.123368710 +0100
  • FreeBSD ls: ls -D '[%F %T %z]' -l file
    -r-xr-xr-x 2 bin bin 372298 [1992-05-13 14:57:00 +0100] file
  • GNU lsls --full-time -l file
    -r-xr-xr-x 2 bin bin 372298 1992-05-13 14:57:00.123368710 +0100 file
  • 即時オープンlsls -Z '%(mtime:time=%F %T.%N %z)s'
    1992-05-13 14:57:00.123368710 +0100

lsお客様のプロフィールで使用中であることを示唆する AIX には、次のものがあります。istat注文する(AIX 5.3 マニュアルページ)、日付全体を表示しますが(forced以外のあいまいな1秒未満の粒度はありませんTZ)、UTC0解析するのは簡単ではありません。

$ LC_ALL=C TZ=UTC0 istat file
Inode 10360 on device 10/6    File
Protection: r-xr-xr-x
Owner: 2(bin)     Group: 2(bin)
Link count: 2     Length 372298 bytes

Last updated:  Wed May 13 14:08:13 1992
Last modified: Wed May 13 13:57:00 1992
Last accessed: Sun Jan 31 15:49:23 1993

また、シンボリックリンクの場合、シンボリックリンク自体ではなくシンボリックリンクターゲットの日付を取得します。

これらのいずれにもアクセスできない場合の移植性のための最良のオプションは次のとおりですperl

$ perl -MPOSIX -le 'print strftime("%Y-%m-%d %T %z", localtime((lstat(shift))[9]))' file
1992-05-13 14:57:00 +0100

システムがほとんどないことに注意してください。作成時間ファイルの場合(時々出生時間)、クエリコマンドはもちろん、標準APIもなく、修正時点よりも状況はより深刻です。

答え2

GNUがある場合ls

ls --time-style=long-iso -l

または

ls --time-style=+FMT -l

ここで、FMT はdateコマンド形式に従います。あなたの場合:

ls --time-style=+%Y/%m/%d -l

答え3

これを行うPOSIX関数は次のとおりです。

mtime() {
   touch -r "$1" /etc/fstab
   diff -u /etc/fstab /dev/null | head -n 1 | cut -f 2
}

結果:

$ mtime ~/.profile
2019-07-01 06:25:34.000000000 -0500

http://cup.github.io/autumn/util/path/file-mtime

関連情報