打印中的Bash文件的最后修改日期(Print a file's last modified

2019-09-02 01:42发布

我似乎无法找到如何打印出文件的日期。 我至今能够打印出所有目录中的文件,但我需要用它打印出日期。

我知道我需要附上日期格式与项的回声,但我无法找到正确的格式。

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

read directory 

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

Answer 1:

您可以使用stat命令

stat -c %y "$entry"

更多信息

%y   time of last modification, human-readable


Answer 2:

是不是“日期”命令更加简单? 无需AWK,统计等。

date -r <filename>

另外,还要考虑看手册页的日期格式; 例如与常见的日期和时间格式:

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


Answer 3:

在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



Answer 4:

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

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


Answer 5:

最好是date -r filename +"%Y-%m-%d %H:%M:%S



Answer 6:

我想获得的文件的修改日期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)


Answer 7:

编辑:原来,我已经忘记了所需的报价$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


Answer 8:

对于换行符我编辑你的代码,并且没有换行的东西。

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


Answer 9:

如果文件名没有空格:

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")}'


Answer 10:

您可以使用:

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

这将在2个位数显示日期。

如果1 9之间它增加了“0”前缀,并转换成01 - 09。

希望这符合预期。



文章来源: Print a file's last modified date in Bash