Печать даты последнего изменения файла в 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
953   9  

9 ответов:

вы можете использовать stat команда

stat -c %y "$entry"

Подробнее

%y   time of last modification, human-readable

разве команда "дата" не намного проще? Нет необходимости в awk, stat и т. д.

date -r <filename>

кроме того, подумайте, глядя на на странице для форматирования даты; например, с общим форматом даты и времени:

date -r <filename> "+%m-%d-%Y %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

лучше date -r filename +"%Y-%m-%d %H:%M:%S

отредактировано: оказывается, я забыл кавычки, необходимые для $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

Я хотел получить дату изменения файла в . Вот как я это сделал:

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)

Если имя файла не содержит пробелов:

ls -l <dir> | awk '{print , " ", , " ", , " ",  }'

печатается в следующем формате:

 Dec   21   20:03   a1.out
 Dec   21   20:04   a.cpp

Если имена файлов имеют пространство (вы можете использовать следующую команду для имен файлов без пробелов тоже, просто это выглядит сложным / уродливым, чем первый):

 ls -l <dir> | awk '{printf ("%s %s %s ",  ,  , ); for (i=9;   i<=NF; i++){ printf ("%s ", $i)}; printf ("\n")}'

Comments

    Ничего не найдено.