Друкуйте останню зміну дати файлу в Bash


147

Я не можу знайти, як роздрукувати дату файлу. Я поки що міг роздрукувати всі файли в каталозі, але мені потрібно роздрукувати дати з ним.

Я знаю, що мені потрібно вкласти формат дати з відлунням запису, але все, що я не можу знайти правильний формат.

echo "Please type in the directory you want all the files to be listed"

read directory 

for entry in "$directory"/*
do
  echo "$entry"
done

2
read -p "Будь ласка, введіть у каталог, у який ви хочете, щоб усі файли були перелічені"
CousinCocaine

Відповіді:


146

Ви можете використовувати stat команду

stat -c %y "$entry"

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

% y час останньої модифікації, зрозуміла людині

for entry in "$directory"/* do stat -c%y "$entry" done Не працює. Виводить stat: зниклий операнд у терміналі
Hokerie

Гм, чи може це бути моїм unbuntu? Чи знаєте ви, які вимоги використання stat?
Хокері

33
Зауважте, що в OS X (Mac) це stat -f "%m%t%Sm %N" filename(див. man stat Приклади для більш детальної інформації)
Олі,

3
Зауважте, що в BSD statкоманда має інший синтаксис. Мій випадок для FreeBSD: stat -f %Sm -t %F" "%R filename.
Sopalajo de Arrierez

228

Чи не команда 'date' набагато простіша? Немає потреби у awk, stat тощо.

date -r <filename>

Крім того, подумайте про перегляд сторінки чоловіка для форматування дати; наприклад, із загальним форматом дати та часу:

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

11
Набагато простіше, ніж використовувати stat / більше доступних.
Інг

11
Схоже, у BSD (або принаймні OS X) dateцього немає. Він -rпросто використовується для надання часової позначки формату. Вам потрібно буде використовувати дату GNU, щоб отримати цю функціональність.
Уелід Хан

4
Використання OSX: датаstat -f "%Sm" -t "%m%d%H%M%y" "${1}"
Michaelangel007

3
У OS X 10.10 дата -r <ім'я_файлу> працює як розміщено в рекламі, хоча довідкова сторінка не описує жодного аргументу <ім'я файла>.
готофріц

3
У macOS 10.13 date [-r seconds | filename]повністю задокументовано на manсторінці та працює як очікувалося.
Ешелон

14

В 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


Якщо ви не з’ясували частину розриву рядка, для програми ехо доступний прапор -e. Приклад використання може бути: echo -e "$(stat -f %Sm -t %Y%m%d_%H%M%S $AFile)\t$AFile.". У вашому випадку це могло бути: echo -e "$(stat -f "%Sm" -t "%Y-%m-%d %H:%M" "$i")\t$i." `
Thoth


6

Додавши до @StevePenny відповідь, ви можете вирізати не читачу людиною частину:

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

3

Я хотів отримати дату модифікації файлу у 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

ВІДРОВАДЖЕНО: виявляється, що я забув лапки, необхідні для $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

Для розривів рядків я редагував ваш код, щоб отримати щось без розривів рядків.

#!/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

1

Якщо в назві файла немає пробілів:

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

А, бачу! В основному це працює, за винятком файлів із пробілами в іменах. Чи є для цього рішення?
Хокері

Насправді я спробував це ще раз, і він не працює ... виявляється, я випробовував каталог, у якому були імена файлів без пробілів. = / Відредагував мою відповідь нижче
Хокері

коли ти кажеш, що це не працює, ви можете сказати, у чому помилка? він працює для мене, коли я його виконував у своїй системі.
Білл

Я отримав "немає такого файлу чи каталогу".
Хокері

Це тому, що ви передали значення, <dir>якого не існує .... код ідеально добре.
Білл

0

Ви можете використовувати:

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

Це відобразить дату в двох цифрах.

Якщо від 1 до 9, він додає до нього префікс "0" і перетворюється на 01 - 09.

Сподіваюся, що це відповідає очікуванням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.