Bashでファイルの最終更新日を印刷する


147

ファイルの日付を印刷する方法が見つからないようです。これまでのところ、ディレクトリ内のすべてのファイルを印刷できますが、日付を一緒に印刷する必要があります。

エントリのエコーに日付形式を添付する必要があることはわかっていますが、正しい形式を見つけることができません。

echo "Please type in the directory you want all the files to be listed"

read directory 

for entry in "$directory"/*
do
  echo "$entry"
done

2
read -p "すべてのファイルをリストするディレクトリを入力してください"ディレクトリ
CousinCocaine

回答:


146

stat 次のコマンドを使用できます

stat -c %y "$entry"

より詳しい情報

%y最終変更時刻、人間が読める形式

for entry in "$directory"/* do stat -c%y "$entry" done 動作しません。statを出力します。ターミナルにオペランドがありません
Hokerie 2013年

えっと、それは私の文句かもしれませんか?使用するための要件を知っていますstatか?
Hokerie 2013年

33
OS X(Mac)の場合stat -f "%m%t%Sm %N" filename(詳細はman stat を参照)
Olie

3
BSDでは、statコマンドの構文が異なることに注意してください。私のFreeBSDの場合:stat -f %Sm -t %F" "%R filename
ソパラホデアリエール2016年

228

「date」コマンドはもっと簡単ではありませんか?awk、statなどは必要ありません。

date -r <filename>

また、日付のフォーマットについては、manページ参照することを検討してください。たとえば、一般的な日付と時刻の形式:

date -r <filename> "+%m-%d-%Y %H:%M:%S"

11
statを使用するよりもはるかに単純です/利用可能です。
Ing

11
BSD(または少なくともOS X)にdateはこれがないようです。これ-rは、フォーマットするタイムスタンプを提供するために使用されます。この機能を使用するには、GNU日付を使用する必要があります。
Waleed Khan

4
OSXでの使用:日付stat -f "%Sm" -t "%m%d%H%M%y" "${1}"
Michaelangel007

3
OS X 10.10では、日付-r <ファイル名>はアドバタイズされたとおりに機能しますが、マニュアルページには<ファイル名>引数は記述されていません。
gotofritz

3
macOS 10.13ではdate [-r seconds | filename]manページに完全に記載されており、期待どおりに動作します。
エシェロン

14

OS Xでは、日付を次の形式にするのが好きです YYYY-MM-DD HH:MMファイルの出力です。

だから私が使用するファイルを指定するには:

stat -f "%Sm" -t "%Y-%m-%d %H:%M" [filename]

さまざまなファイルで実行したい場合は、次のようにします。

#!/usr/bin/env bash
for i in /var/log/*.out; do
  stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i"
done

この例ではsudo periodic daily weekly monthly、ログファイルを参照しているため、コマンドを最後に実行したときに出力されます。


各日付の下にファイル名を追加するには、代わりに次のコマンドを実行します。

#!/usr/bin/env bash
for i in /var/log/*.out; do
  stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i"
  echo "$i"
done

出力は次のようになります。

2016-40-01 16:40
/var/log/daily.out
2016-40-01 16:40
/var/log/monthly.out
2016-40-01 16:40
/var/log/weekly.out

残念ながら、改行を防ぎ、スクリプトに行を追加せずに日付の最後にファイル名を追加し続ける方法はわかりません。


PS- #!/usr/bin/env bash私は毎日Pythonユーザーなbashので、代わりにシステムに異なるバージョンのバージョンをインストールしているので使用しています#!/bin/bash


改行部分がわからない場合は、echoプログラムで-eフラグを使用できます。使用例は次のとおり echo -e "$(stat -f %Sm -t %Y%m%d_%H%M%S $AFile)\t$AFile."です。あなたのケースでは、それは次のようになります。 echo -e "$(stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i")\t$i." `
トート


6

@StevePennyの回答に加えて、それほど人間が読めない部分をカットしたい場合があります。

stat -c%y Localizable.strings | cut -d'.' -f1

3

ファイルの変更日をYYYYMMDDHHMMSSフォーマットで取得したかった。ここに私がそれをした方法があります:

date -d @$( stat -c %Y myfile.css ) +%Y%m%d%H%M%S

説明。これらのコマンドの組み合わせです。

stat -c %Y myfile.css # Get the modification date as a timestamp
date -d @1503989421 +%Y%m%d%H%M%S # Convert the date (from timestamp)

2

編集:$entry正しく印刷するために必要な引用を忘れていて、「そのようなファイルやディレクトリはありません」というエラーが発生しないことがわかりました。助けてくれてありがとう!

これが私の最終的なコードです:

    echo "Please type in the directory you want all the files to be listed with last modified dates" #bash can't find file creation dates

read directory

for entry in "$directory"/*

do
modDate=$(stat -c %y "$entry") #%y = last modified. Qoutes are needed otherwise spaces in file name with give error of "no such file"
modDate=${modDate%% *} #%% takes off everything off the string after the date to make it look pretty
echo $entry:$modDate

次のように出力します。

/home/joanne/Dropbox/cheat sheet.docx:2012-03-14
/home/joanne/Dropbox/Comp:2013-05-05
/home/joanne/Dropbox/Comp 150 java.zip:2013-02-11
/home/joanne/Dropbox/Comp 151 Java 2.zip:2013-02-11
/home/joanne/Dropbox/Comp 162 Assembly Language.zip:2013-02-11
/home/joanne/Dropbox/Comp 262 Comp Architecture.zip:2012-12-12
/home/joanne/Dropbox/Comp 345 Image Processing.zip:2013-02-11
/home/joanne/Dropbox/Comp 362 Operating Systems:2013-05-05
/home/joanne/Dropbox/Comp 447 Societal Issues.zip:2013-02-11

2

改行については、改行のないものを取得するようにコードを編集しました。

#!/bin/bash
for i in /Users/anthonykiggundu/Sites/rku-it/*; do
   t=$(stat -f "%Sm"  -t "%Y-%m-%d %H:%M" "$i")
   echo $t : "${i##*/}"  # t only contains date last modified, then only filename 'grokked'- else $i alone is abs. path           
done

1

ファイル名にスペースがない場合:

ls -l <dir> | awk '{print $6, " ", $7, " ", $8, " ", $9 }'

これは次の形式で出力されます。

 Dec   21   20:03   a1.out
 Dec   21   20:04   a.cpp

ファイル名にスペースがある場合(スペースのないファイル名にも次のコマンドを使用できます。前のコマンドよりも複雑で見苦しいだけです):

 ls -l <dir> | awk '{printf ("%s %s %s ",  $6,  $7, $8); for (i=9;   i<=NF; i++){ printf ("%s ", $i)}; printf ("\n")}'

ああ、なるほど!名前にスペースが含まれているファイルを除いて、これはほとんど機能します。その解決策はありますか?
Hokerie 2013年

実際、私はもう一度試してみましたが、機能しません...スペースのないファイル名を持つディレクトリを試してみました。= /以下の私の回答を編集
Hokerie 2013年

それが機能しないと言うとき、あなたはエラーが何であるか言うことができますか?私のシステムで実行したときに機能します。
ビル

「そのようなファイルやディレクトリはありません」が表示されました。
Hokerie 2013年

これは、<dir>存在しない値を渡したためです。コードは完全に問題ありません。
ビル

0

以下を使用できます。

ls -lrt filename |awk '{print "%02d",$7}'

これにより、日付が2桁で表示されます。

1から9までの場合、「0」プレフィックスが追加され、01-09に変換されます。

これが期待を満たしていることを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.