在Bash中打印文件的最后修改date

我似乎无法find如何打印出文件的date。 我到目前为止能够打印出目录中的所有文件,但是我需要用它打印出date。

我知道我需要附加条目的回声date格式,但我找不到正确的格式。

echo "Please type in the directory you want all the files to be listed" read directory for entry in "$directory"/* do echo "$entry" done 

你可以使用stat命令

 stat -c %y "$entry" 

更多信息

 %y上次修改时间,人类可读

“date”命令不是很简单吗? 不需要awk,stat等

 date -r <filename> 

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

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

在OS X上,我喜欢我的date格式为文件输出中的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命令,因为它引用了日志文件。


要在每个date下添加文件名,我将运行以下代码:

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

不幸的是,我不知道如何防止换行,并保持文件名追加到date的末尾,而无需添加更多的行到脚本。


PS – 我使用#!/usr/bin/env bash因为我是一名Python用户,并且在我的系统上安装了不同版本的bash ,而不是#!/bin/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 

如果文件名没有空格:

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

这将打印为以下格式:

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

如果文件名有空格(你可以使用下面的命令来input文件名,而不是空格,只是看起来比前者复杂/丑陋):

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

编辑:事实certificate,我已经忘记$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 

我想以YYYYMMDDHHMMSS格式获取文件的修改date。 我是这样做的:

 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)