отримати вік даного файлу


13

Як я можу досягти віку певного файлу принаймні за кілька днів?

Я добре знаю ls -lhі подібні команди. Я хочу щось подібне:

getfage <FILE> # prints out '12d' (12 days)

Крім того, це має бути дещо крос-платформним, оскільки я також хотів би використовувати це під Mac OS X, але основний випадок використання знаходиться на моєму Linux-вікні.

ПРИМІТКА

Оскільки Linux не відстежує час створення, я шукаю дворазове рішення: одне для mtime (linux) - це останній раз, коли зазначений файл було змінено - і один для Mac OS X, який може мати справу з mtime або час створення.



@slm Це стосується конкретно часу створення, воно не входить до обчислення віку в командному рядку.
Жил 'SO- перестань бути злим'


@terdon, не дуже. Дивіться мій ПРИМІТКА вище.
Олексій Магура

@AlexejMagura і як відповіді в дупі не роблять для тебе? statдає вам все, що вам потрібно?
terdon

Відповіді:


17

Unix не відстежує дату створення. Єдина доступна інформація, як правило, останній раз, коли файли були:

  1. Доступний
  2. Змінено
  3. Змінено
  • Доступ - останній раз, коли файл було прочитано
  • Змінити - останній раз, коли файл було змінено (вміст змінено)
  • Змінити - востаннє метадані файлу були змінені (наприклад, дозволи)

( З цієї відповіді )

Ви можете отримати дати, пов'язані з певним файлом, за допомогою statкоманди.

Приклад

$ stat ffmpeg 
  File: `ffmpeg'
  Size: 19579304    Blocks: 38248      IO Block: 4096   regular file
Device: fd02h/64770d    Inode: 10356770    Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (  500/    saml)   Gid: (  501/    saml)
Access: 2013-11-26 10:49:09.908261694 -0500
Modify: 2013-11-02 17:05:13.357573854 -0400
Change: 2013-11-02 17:05:13.357573854 -0400

OSX і HFS

Якщо ви використовуєте OSX, файлова система, яка використовується під цим Unix, є HFS . Це одна з небагатьох (що мені відомо), яка зберігає дату створення у файловій системі разом із часом модифікації тощо, подібним до інших Unixes.

витяг

Запис файлів зберігає різноманітні метадані про файл, включаючи його CNID, розмір файлу, три часові позначки (коли файл був створений, востаннє змінений, востаннє створено резервну копію), перші розширення файлів для вилки даних та ресурсів, вилки та покажчики до перших записів та даних про розмір файлу у файлі Extent Overflow. Запис файлів також зберігає два 16-байтових полів, які Finder використовує для зберігання атрибутів файлу, включаючи такі речі, як код його творця, код типу, вікно, у якому має з’явитися файл, та його розташування у вікні.

Мітки часу

Часові позначки завжди підтримуються у файловій системі, тому ви обмежені тим, що через них буде відстежено час (EXT3, EXT4, XFS тощо).

Файлові системи

Якщо вам коли-небудь цікаво, погляньте на цю тему Вікіпедії під назвою: Порівняння файлових систем . У ньому є найширший список файлових систем, про які я знаю, разом із приємною таблицею різних функцій та статусу, підтримується чи ні в даній файловій системі.

Список літератури


Дякуємо за оновлення, яке допомагає. Насправді я прочитав тут, що ext4 може зберігати дати створення, але це ще не було реалізовано в ядрі.
terdon

@terdon - так, має сенс, що деякі файлові системи підтримували б його. Мені це здається давно назрілим, я в минулому розумів, чому це було відсторонено, але все настільки розвинулося з самого початку, що явно не має сенсу цього мати. Також ви можете відключити підтримку часу доступу, щоб вона могла бути реалізована аналогічно, а потім відключена, якщо ви її справді не хотіли.
slm

19

OSX відслідковує створення файлів, але більшість інших уніфікатів цього не робить, тому немає ніякого способу дізнатися пройдений час з моменту створення файлу. Ви можете отримати минулий час з часу його останньої модифікації майже на будь-якій операційній системі.

Немає портативної утиліти оболонки для отримання часу модифікації файлу, за винятком того, lsякий має вихід, який майже неможливо проаналізувати. У Linux наступна команда друкує вік файлу:

echo $(($(date +%s) - $(date +%s -r "$filename"))) seconds
echo $((($(date +%s) - $(date +%s -r "$filename")) / 86400)) days

У Linux можна використовувати stat -c %Y -- "$filename"як синонім date +%s -r "$filename".

OSX dateі statкоманди різні. Можна використовувати таку команду:

echo $(($(date +%s) - $(stat -t %s -f %m -- "$filename"))) seconds

Невбудовані системи Linux та OSX за замовчуванням встановлені Perl.

perl -l -e 'print -M $ARGV[0], " days"' "$filename"

Це залежить від ОС або файлової системи? Це запитання і відповіді, мабуть, означає, що файлова система зберігає їх, але ядро ​​має надати метод доступу до них.
тердон

@terdon - дивіться мої оновлення.
slm

@terdon Обидва. Те, що Ви посилаєтесь на запитання та відповіді, правильне, поточні файлові системи вже деякий час відстежують час створення. У FreeBSD ви можете реально дістатись до цього stat, у Linux системний виклик не був перероблений, тому вам доведеться вдаватися до злому debugfs.
крила підводного човна

1
@wingedsubmariner З зауваженням, що час створення файлової системи часто не є датою створення в додатку, оскільки багато додатків використовують create-new-then-move як метод збереження нової версії, а не перезапис на місці.
Жил "ТАК - перестань бути злим"

4

На основі відповіді Гілла, ось функція bash, яка повертає вік файлу за секунди або помилку.

function fileAge
{
    local fileMod
    if fileMod=$(stat -c %Y -- "$1")
    then
        echo $(( $(date +%s) - $fileMod ))
    else
        return $?
    fi
}

1
Акуратна функція, легко адаптується, додавши простий поділ, щоб побачити вік у годину, дні, тиждень ....
Еммануель Дево

0

Ви можете використовувати stat -f%B, ls -lUабо mdls -n kMDItemFSCreationDateпобачити час створення (народження) в OS X:

$ stat -f%B file
1402340803
$ ls -lU file
-rw-r--r--  1 admin  staff  108514 Jun  9 22:06 file
$ mdls -n kMDItemFSCreationDate file
kMDItemFSCreationDate = 2014-06-09 19:06:43 +0000
$ echo $((($(date +%s)-$(stat -f%B file))/86400))
10

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