web-dev-qa-db-ja.com

ファイルの変更時刻を表示する方法は?

Bashスクリプト内で使用するために、ファイルの変更された時間を見つけて出力する方法が欲しいのです。

私は思いついた:

ls -l $filename | cut -d ' ' -f '6-8'

どの出力:

Jul 26 15:05

lsの解析を回避したいのですが、年をそこに入れると便利です。

理想的には、dateコマンドのデフォルト出力に似た出力を見たいです。

Tue Jul 26 15:20:59 BST 2016

他にどのような便利な方法が利用できますか?

32
Arronical

lsは使用しないでください。これはstatの仕事です:

stat -c '%y' filename

-cを使用すると、特定の出力を取得できます。ここでは%yを使用すると、人間が読み取れる形式のファイルの最終変更時刻を取得できます。エポック以降の時間を秒単位で取得するには、%Yを使用します。

stat -c '%Y' filename

ファイル名も必要な場合は、%nを使用します。

stat -c '%y : %n' filename
stat -c '%Y : %n' filename

必要に応じてフォーマット指定子を設定します。 man statを確認してください。

例:

% stat -c '%y' foobar.txt
2016-07-26 12:15:16.897284828 +0600

% stat -c '%Y' foobar.txt
1469513716

% stat -c '%y : %n' foobar.txt
2016-07-26 12:15:16.897284828 +0600 : foobar.txt    

% stat -c '%Y : %n' foobar.txt
1469513716 : foobar.txt

Tue Jul 26 15:20:59 BST 2016のような出力が必要な場合は、dateへの入力としてエポック時間を使用します。

% date -d "@$(stat -c '%Y' a.out)" '+%a %b %d %T %Z %Y'
Tue Jul 26 12:15:21 BDT 2016

% date -d "@$(stat -c '%Y' a.out)" '+%c'               
Tue 26 Jul 2016 12:15:21 PM BDT

% date -d "@$(stat -c '%Y' a.out)"
Tue Jul 26 12:15:21 BDT 2016

dateのフォーマット指定子をチェックして、必要に応じてください。 man dateもご覧ください。

44
heemayl

私は試した

ls -l $filename | cut -d ' ' -f '6-8'

ただし、日付が10未満の場合、時刻が欠落します。これは、10未満の場合、日付の前に余分なスペースがあるためです。これを試してください。

filename="test.txt"
ls -l $filename | awk -F ' ' '{print $6" "$7" "$8}'

Awkコマンドは、すべてのスペース(-F '')で区切られたフィールドを出力します。それがうまくいくことを願っています。私はこれが元の質問に答えていないことを知っていますが、日付と時刻についてのlsコマンドの説明だけです。 「ubuntu get date and time of file」をGoogleで検索すると、この質問が一番上に表示されます。これは私が探していたものです。年も必要ないからです。年、日付、および時刻については、以下のコマンドのいずれかを試すことができます。 %mは月番号を出力します。 %bは月の省略形を出力します:時間と分が必要ない場合は、%H:%Mを削除します。 %-dは、月の最初のゼロを出力しません。

date -r $filename +"%Y %m %-d %H:%M"
date -r $filename +"%y %m %-d %H:%M"
date -r $filename +"%Y %b %-d %H:%M"
date -r $filename +"%y %b %-d %H:%M"
1
te7

date -r <filename>はうまく機能します。標準のdateフォーマット文字列は機能しますが、デフォルトはdateが通常出力するものとまったく同じであり、これは望みどおりです。

0
Someone