web-dev-qa-db-ja.com

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

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

エントリのエコーを含む日付形式を添付する必要があることは知っていますが、正しい形式が見つかりません。

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

read directory 

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

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

stat -c %y "$entry"

詳細情報

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

「日付」コマンドははるかに簡単ではありませんか? awk、statなどは不要.

date -r <filename>

また、日付のフォーマットについては manページ をご覧ください。たとえば、一般的な日付と時刻の形式の場合:

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

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-私はPythonユーザーであるため、#!/usr/bin/env bashを使用し、#!/bin/bashではなくbashの異なるバージョンがシステムにインストールされています

13
Danijel-James W

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

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

最高はdate -r filename +"%Y-%m-%d %H:%M:%S"

5
rishi

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

編集済み:正しく印刷し、「no such file or directory」エラーを出さないために$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
Hokerie

改行については、改行なしで何かを取得するためにコードを編集しました。

    #!/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
2
Anton Kiggundu

ファイル名にスペースが含まれていない場合:

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")}'
1
Bill

次を使用できます。

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

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

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

これが期待に応えることを願っています。

0
Yoga Nathan