Як відобразити модифікований час файлу?


35

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

Я придумав:

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

Які виходи:

Jul 26 15:05

Хоча я хотів би уникнути розбору ls, також було б корисно провести рік там.

В ідеалі я хотів би побачити вихід, схожий на вихідний за замовчуванням dateкоманди.

Tue Jul 26 15:20:59 BST 2016

Які ще корисні методи доступні?

Відповіді:


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, використовуйте час епохи як вхід для 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теж.


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