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