別のプログラムに渡すために、特定のファイルの完全な日付(生成または変更)を取得しようとしています。さまざまなオプションで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-time
GNUls
や-D <format>
FreeBSDを使用)。ls
stat
この機能を提供できるさまざまな互換性のないコマンド実装(IRIX、zsh
組み込み、GNU、BSD)があります。
-printf
または、GNU述語を使用することもできますfind
。または-r
GNUオプションdate
。
すべての実装が1秒未満の粒度を提供するわけではありません。指定された出力はあいまいで、選択した形式と現在のタイムゾーンに応じて複数の日付を参照できるため、タイムゾーンとDSTに注意してください。
シンボリックリンクの場合は、リンクまたはターゲットの修正時刻であるかどうかを自分で尋ねることもできます。ここに記載されているオプションのいくつかは基本的にこれらのいずれかを実行し、一部は必要に応じてそれらのいずれかを実行するように指示できます。
zsh
統計:stat -F '%Y-%m-%d %T.%N %z' +mtime file
↳1992-05-13 14:57:00.123368710 +0100
- GNU
stat
:stat -c %y file
↳1992-05-13 14:57:00.123368710 +0100
- BSD
stat
:stat -t '%F %T %z' -f %Sm file
↳1992-05-13 14:57:00 +0100
- アイリックス
stat
:stat -m file
- GNU
find
:find file -prune -printf '%TF %TT %Tz\n'
↳1992-05-13 14:57:00.1233687100 +0100
- GNU
date
:date -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
ls
:ls --full-time -l file
↳-r-xr-xr-x 2 bin bin 372298 1992-05-13 14:57:00.123368710 +0100 file
- 即時オープン
ls
:ls -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