2013-05-06 111 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

阅读-p目录 – CousinCocaine 2014-07-10 11:08:28

回答

75

可以使用 stat 命令

stat -c %y "$entry" 

更多信息

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

'为“$目录”条目“请你想被列出的所有文件的目录,键入”/* 做 统计-C %y“$ entry” done' 不起作用。打印出stat:在终端中丢失操作数 – Hokerie 2013-05-06 02:52:00

+0

嗯,它可能是我的unbuntu?你知道使用'stat'的要求是什么吗? – Hokerie 2013-05-06 02:57:18

+20

请注意,在OS X(Mac)上,它是'stat -f“%m%t%Sm%N”filename'(请参阅'man stat' **示例**了解更多详情) – Olie 2014-10-09 23:45:27

5

添加到@StevePenny答案,你可能要削减的不那么人类可读部分:

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 

如果文件名具有空间(可以为文件名使用下面的命令不带空格太,只是看起来比较复杂/丑比前者):

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

啊,我明白了!除了名称中包含空格的文件之外,它们大多可用。有没有解决方案? – Hokerie 2013-05-06 03:02:08

+0

编辑答案...请尝试。 – Bill 2013-05-06 03:06:47

+0

其实,我又试了一遍,它不起作用......原来我正在尝试一个没有空格的文件名的目录。 = /当编辑我的回答低于 – Hokerie 2013-05-06 22:52:39

2

编辑:原来,我已经忘记了需要报价为了正确打印并且不给“没有这样的文件或目录”错误。非常感谢你帮助我!

这是我的最终代码:

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

是不是 '日期' 命令更加简单?无需AWK,统计等

date -r <filename> 
+8

更简单,然后使用stat/more可用。 – Ing 2014-04-25 13:49:05

+9

它看起来像BSD(或者至少OS X的)'日期'没有这个。它的'-r'只是用来提供格式化的时间戳。你将不得不使用GNU日期来获得这个功能。 – 2014-07-01 00:42:57

+3

在OSX上使用:date'stat -f“%Sm”-t“%m%d%H%M%y”“$ {1}”' – Michaelangel007 2016-02-22 01:19:56

6

在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用户,并安装在我的系统,而不是#!/bin/bash

2

对于换行符我编辑你的代码在不同版本的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)