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