2013-05-06 10 views
62

ファイルの日付をプリントアウトする方法がわかりません。私はこれまでディレクトリ内のすべてのファイルをプリントアウトすることができますが、日付をプリントアウトする必要があります。ファイルの最終更新日を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 
+1

は のstat -cを行う「$ディレクトリ」内のエントリのためのディレクトリ – CousinCocaine

答えて

75

あなたは stat コマンド@StevePennyの答えに追加

stat -c %y "$entry" 

詳細情報

 
%y time of last modification, human-readable 
+0

を '「あなたはすべてのファイルがリストされていることにしたいディレクトリを入力してください」/ * を-p読みます%y "$ entry" done' 動作しません。 stat:ターミナルにオペランドがありません。 – Hokerie

+0

ええと、それは私のunbuntuでしょうか? 'stat'を使うための要件が​​何であるか知っていますか? – Hokerie

+20

OS X(Mac)では、 'stat -f"%m%t%Sm%N "filename'です(詳細は' man stat' ** examples **を参照してください)。 – Olie

5

を使用することができ、あなたはそれほど人間ではないが読めるをカットしたい場合があります部:

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

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

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

これは次の形式として出力します:ファイル名にスペースがある場合は、あまりにもスペースなしでファイル名を次のコマンドを使用することができます(

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

、それは)前者より醜い/複雑に見えます:

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

ああ、私は見る!それはほとんどの場合、名前にスペースを含むファイルを除いて動作します。そのための解決法はありますか? – Hokerie

+0

答えを編集しました... plsしようとします。 – Bill

+0

実際、私はもう一度試してみるとうまくいきません...ファイル名に空白がないディレクトリを試していたことがわかりました。 = /私の答えは – Hokerie

2

:私はために必要な引用符を忘れていたことが判明します正しく印刷し、 "no such file or directory"エラーを出さないようにするためです。私を助けてくれてありがとう!ここで

は私の最終的なコードです:

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 
111

は、はるかに簡単な '日付' コマンドではないですか? OS X上などのawkの必要性、STAT、ノー

date -r <filename> 
+8

もっと簡単にstat/moreを利用できます。 – Ing

+9

BSD(または少なくともOS Xの)のように、 'date'はこれを持っていません。その '-r'はフォーマットするためのタイムスタンプを提供するために使われます。この機能を利用するには、GNUの日付を使用する必要があります。 –

+3

OSXの場合: 'stat -f"%Sm "-t"%m%d%H%M%y "" $ {1} "' – Michaelangel007

6

、私は私の日付はファイルの出力に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のユーザーだし、私はあなたのコードを編集し、改行のために代わりに#!/bin/bash

2

の私のシステムにインストールされbashの異なるバージョンを持っているように、私は#!/usr/bin/env bashを使用改行なしで何かを得る。

#!/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

ファイルの変更日を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) 
関連する問題