Ответ 1
Вы можете использовать
stat
Команда
stat -c %y "$entry"
Дополнительная информация
%y time of last modification, human-readable
Я не могу найти, как распечатать дату файла. Я до сих пор могу распечатать все файлы в каталоге, но мне нужно распечатать даты с ним.
Я знаю, что мне нужно прикрепить формат даты с эхом записи, но я не могу найти правильный формат.
echo "Please type in the directory you want all the files to be listed"
read directory
for entry in "$directory"/*
do
echo "$entry"
done
Вы можете использовать
stat
Команда
stat -c %y "$entry"
Дополнительная информация
%y time of last modification, human-readable
Разве команда date не намного проще? Нет необходимости в 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
К сожалению, я не уверен, как предотвратить разрыв строки и сохранить имя файла, добавленное до конца даты, без добавления дополнительных строк в script.
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"
Я хотел получить дату изменения файла в формате 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)
EDITED: выясняется, что я забыл кавычки, необходимые для $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 цифры.
Если между 1 и 9 он добавляет префикс "0", он преобразуется в 01–09.
Надеюсь, что это соответствует ожиданиям.