183

我似乎找不到如何打印文件的日期。到目前为止,我能够打印出目录中的所有文件,但我需要打印出日期。

我知道我需要在条目的回声中附加一个日期格式,但是我找不到正确的格式。

echo "Please type in the directory you want all the files to be listed"

read directory 

for entry in "$directory"/*
do
  echo "$entry"
done
4

10 回答 10

289

'date' 命令不是更简单吗?不需要 awk、stat 等。

date -r <filename>

另外,考虑查看日期格式的手册页;例如使用常见的日期和时间格式:

date -r <filename> "+%m-%d-%Y %H:%M:%S"
于 2013-12-27T20:25:34.793 回答
161

你可以使用 stat 命令

stat -c %y "$entry"

更多信息

%y 上次修改时间,可读
于 2013-05-06T02:30:11.517 回答
24

或者,您也可以尝试:

date -r filename +"%Y-%m-%d %H:%M:%S"
于 2018-04-18T06:07:59.130 回答
16

在 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

于 2016-05-01T07:21:54.400 回答
6

添加到@StevePenny 的答案中,您可能想要删除不那么人类可读的部分:

stat -c%y Localizable.strings | cut -d'.' -f1
于 2013-05-06T02:33:39.193 回答
3

我想以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)
于 2017-08-30T08:44:57.180 回答
3

对于换行符,我编辑了您的代码以获得没有换行符的内容。

#!/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
于 2016-05-13T08:35:32.050 回答
2

已编辑:原来我忘记了$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
于 2013-05-06T03:18:28.003 回答
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")}'
于 2013-05-06T02:51:33.823 回答
0

您可以使用:

ls -lrt filename |awk '{print "%02d",$7}'

这将以 2 位数字显示日期。

如果介于19之间,则为其添加“0”前缀并转换为 01 - 09。

希望这符合预期。

于 2019-01-07T14:40:01.183 回答