我似乎找不到如何打印文件的日期。到目前为止,我已经能够打印出目录中的所有文件,但我需要用它打印出日期。
我知道我需要附加一个带有条目回显的日期格式,但我找不到正确的格式。
echo "Please type in the directory you want all the files to be listed"
read directory
for entry in "$directory"/*
do
echo "$entry"
done
‘date’命令是不是简单多了?不需要 awk、stat 等
date -r <filename>
另外,请考虑查看手册页以了解日期格式;例如,使用常见的日期和时间格式:
date -r <filename> "+%m-%d-%Y %H:%M:%S"
或者,您也可以尝试:
date -r filename +"%Y-%m-%d %H:%M:%S"
在 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 用户,并且在我的系统上安装了不同版本的 bash
,而不是 #!/bin/bash
添加@StevePenny 的答案,您可能想删除不那么人类可读的部分:
stat -c%y Localizable.strings | cut -d'.' -f1
对于换行符,我编辑了您的代码以获得没有换行符的内容。
#!/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
如果文件名有空格(对于没有空格的文件名也可以使用以下命令,只是看起来比前者复杂/难看):
ls -l <dir> | awk '{printf ("%s %s %s ", $6, $7, $8); for (i=9; i<=NF; i++){ printf ("%s ", $i)}; printf ("\n")}'
编辑:事实证明,我忘记了
$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 -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)
以 YYYYMMDD_hhmm 格式获取文件的修改日期:
date -r <file> "+%Y%m%d_%H%M"
20240119_1018
MODDATE=`date -r <file> "+%Y%m%d_%H%M"`
echo $MODDATE
20240119_1018
这也可以通过暴力方式完成
stat -c %y <file>
2024-01-19 10:18:17.000000000 -0500
stat -c %y <file> | sed "s/^\(....\)-\(..\)-\(..\) \(..\):\(..\).*$/\1\2\3_\4\5/"
20240119_1018
MODATE=`stat -c %y <file> | sed "s/^\(....\)-\(..\)-\(..\) \(..\):\(..\).*$/\1\2\3_\4\5/"`
echo $MODATE
20240119_1018
您可以使用:
ls -lrt filename |awk '{printf "%02d",$7}'
这将以 2 位数字显示日期(当前日期)。
如果在 1 到 9 之间,则会添加“0”前缀并转换为 01 - 09。
希望这能达到预期。