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


147

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

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

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

read directory 

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

2
读取-p“请输入要列出所有文件的目录”目录
CousinCocaine 2014年

Answers:


146

您可以使用以下 stat 命令

stat -c %y "$entry"

更多信息

上次修改时间的%y,易于阅读

for entry in "$directory"/* do stat -c%y "$entry" done 不起作用 打印输出统计信息:终端中缺少操作数
Hokerie

嗯,可能是我的文登吗?您知道使用的要求stat是什么吗?
霍基里

33
请注意,在OS X(Mac)上stat -f "%m%t%Sm %N" filename(请参阅man stat 示例以了解更多详细信息)
Olie

3
请注意,在BSD上,该stat命令具有不同的语法。我为FreeBSD情况:stat -f %Sm -t %F" "%R filename
Sopalajo de Arrierez,2016年

228

'date'命令难道不是很简单吗?不需要awk,stat等。

date -r <filename>

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

date -r <filename> "+%m-%d-%Y %H:%M:%S"

11
然后使用stat更简单/可用的更多。
Ing 2014年

11
看起来BSD(或至少是OS X)date没有此功能。它-r仅用于提供格式化时间戳记。您必须使用GNU date来获得此功能。
Waleed Khan 2014年

4
在OSX上使用:日期stat -f "%Sm" -t "%m%d%H%M%y" "${1}"
Michaelangel007

3
在OS X 10.10上,日期-r <文件名>按公布的方式工作,尽管手册页没有描述任何<文件名>参数。
gotofritz

3
在页面中date [-r seconds | filename]完整记录了macOS 10.13 中的内容man,并且可以正常工作。
梯队'18

14

在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


如果您还没有找到换行符,则-e标志可用于echo程序。用法示例可能是: echo -e "$(stat -f %Sm -t %Y%m%d_%H%M%S $AFile)\t$AFile."。你的情况可能是: echo -e "$(stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i")\t$i." `
托特


6

除了@StevePenny答案外,您可能还想减少一些不太容易理解的部分:

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

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)

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

2

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

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

如果文件名没有空格:

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年

实际上,我再次尝试了一下,但是它不起作用...原来,我正在尝试的目录中包含没有空格的文件名。= /在下面编辑了我的答案
Hokerie

当您说它不起作用时,您能说出什么错误吗?当我在系统上执行它时,它对我有用。
法案

我得到“没有这样的文件或目录”。
Hokerie

那是因为您传递的值<dir>不存在。
法案

0

您可以使用:

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

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

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

希望这符合期望。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.