簡體   English   中英

在 Bash 中打印文件的上次修改日期

[英]Print a file's last modified date in Bash

我似乎無法找到如何打印出文件的日期。 到目前為止,我能夠打印出目錄中的所有文件,但我需要用它打印出日期。

我知道我需要在條目的回顯中附加日期格式,但我找不到正確的格式。

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"

您可以使用stat命令

stat -c %y "$entry"

更多信息

%y   time of last modification, human-readable

最好的是

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

我想以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)

編輯:結果我忘記了$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

對於換行符,我編輯了您的代碼以獲得沒有換行符的內容。

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

您可以使用:

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

這將以 2 位數字顯示日期。

如果在19之間,它會為其添加“0”前綴並轉換為 01 - 09。

希望這符合預期。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM