Как отобразить время изменения файла?

35

Я хотел бы метод, чтобы найти и распечатать измененное время файла, для использования в скрипте bash.

Я придумал:

ls -l $filename | cut -d ' ' -f '6-8'

Какие выводы:

Jul 26 15:05

Хотя я хотел бы избежать разбора ls, также было бы полезно иметь год там.

В идеале я хотел бы видеть вывод, аналогичный выводу команды по умолчанию date.

Tue Jul 26 15:20:59 BST 2016

Какие еще полезные методы доступны?

Arronical
источник

Ответы:

46

Не используйте ls, это работа для stat:

stat -c '%y' filename

-cпозволяет нам получить конкретный вывод, здесь %yмы получим время последнего изменения файла в удобочитаемом формате. Чтобы получить время в секундах с начала эпохи %Y:

stat -c '%Y' filename

Если вы тоже хотите имя файла, используйте %n:

stat -c '%y : %n' filename
stat -c '%Y : %n' filename

Установите спецификаторы формата в соответствии с вашими потребностями. Проверьте man stat.

Пример:

% stat -c '%y' foobar.txt
2016-07-26 12:15:16.897284828 +0600

% stat -c '%Y' foobar.txt
1469513716

% stat -c '%y : %n' foobar.txt
2016-07-26 12:15:16.897284828 +0600 : foobar.txt    

% stat -c '%Y : %n' foobar.txt
1469513716 : foobar.txt

Если вы хотите вывод, например Tue Jul 26 15:20:59 BST 2016, используйте время Epoch в качестве ввода для date:

% date -d "@$(stat -c '%Y' a.out)" '+%a %b %d %T %Z %Y'
Tue Jul 26 12:15:21 BDT 2016

% date -d "@$(stat -c '%Y' a.out)" '+%c'               
Tue 26 Jul 2016 12:15:21 PM BDT

% date -d "@$(stat -c '%Y' a.out)"
Tue Jul 26 12:15:21 BDT 2016

Проверьте dateспецификаторы формата, чтобы удовлетворить ваши потребности. Смотри man dateтоже.

heemayl
источник
5
В дополнение к этому ответу, имейте в виду, что lsон непоследовательно реализован в разных системах и поэтому никогда не должен использоваться для какой-либо автоматизации. Вместо этого используйте такие команды, как statи findпри написании сценариев.
Пэдди Ландау
1
превосходно. Я не знал об этом маленьком сокровище. Их так много в среде * nix / linux еще предстоит обнаружить.
Кен Ингрэм
1

Я пытался

ls -l $filename | cut -d ' ' -f '6-8'

но если дата меньше 10, она пропускает время. Это из-за дополнительного места перед датой, если меньше 10. Попробуйте это:

filename="test.txt"
ls -l $filename | awk -F ' ' '{print $6" "$7" "$8}'

Команда awk печатает поля, разделенные пробелами (-F ''). Надеюсь, что это работает. Я знаю, что это не отвечает на первоначальный вопрос, а только разъяснение по команде ls только для даты и времени. Когда вы Google «Ubuntu получаете дату и время файла», он перечисляет этот вопрос в верхней части, что я и искал, так как год мне тоже не нужен. Для года, даты и времени вы можете попробовать одну из команд ниже. % m печатает номер месяца. % b печатает сокращение месяца: отбросьте% H:% M, если вам не нужны часы и минуты. % -d не печатает ведущий ноль для дня месяца.

date -r $filename +"%Y %m %-d %H:%M"
date -r $filename +"%y %m %-d %H:%M"
date -r $filename +"%Y %b %-d %H:%M"
date -r $filename +"%y %b %-d %H:%M"
ТЕ7
источник