it-swarm.com.ru

Напечатайте дату последнего изменения файла в 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
97
Hokerie

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

stat -c %y "$entry"

Больше информации

% y время последней модификации, удобочитаемое 
106
Steven Penny

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

date -r <filename>

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

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

В 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

12
Danijel-James W

Добавляя к ответу @StevePenny, вы, возможно, захотите вырезать не так понятную человеку часть:

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

Best is date -r filename +"%Y-%m-%d %H:%M:%S

3
rishi

Я хотел получить дату изменения файла в формате 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
Fabien Snauwaert

РЕДАКТИРОВАНИЕ: оказывается, что я забыл кавычки, необходимые для $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
Hokerie

Для разрывов строк я отредактировал ваш код, чтобы получить что-то без разрывов строк. 

    #!/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
2
Anton Kiggundu

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

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

Ты можешь использовать:

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

Это будет отображать дату в 2 цифры.

Если между 1 to 9 он добавляет к нему префикс «0» и конвертирует в 01 - 09. 

Надеюсь, что это соответствует ожиданиям.

0
Yoga Nathan