получить возраст данного файла

12

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

Мне хорошо известны ls -lhи похожие команды. Я хочу что-то, что будет работать примерно так:

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

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

НОТА

Поскольку Linux не отслеживает время создания, я ищу двойное решение: одно для mtime (linux) - это последний раз, когда указанный файл был изменен - и одно для Mac OS X, которое может иметь дело либо с время или время создания.

Алексей Магура
источник
@slm Речь идет именно о времени создания, а не о вычислении возраста в командной строке.
Жиль "ТАК ... перестать быть злым"
@terdon, не совсем. Смотрите мое ПРИМЕЧАНИЕ выше.
Алексей Магура
@AlexejMagura а как ответы в дупе не для тебя? statдает вам все, что вам нужно, верно?
Тердон

Ответы:

16

Unix не отслеживает дату создания. Единственная доступная информация - это, как правило, последние файлы:

  1. Accessed
  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, размер файла, три метки времени (когда файл был создан, последний раз изменен, последнее резервное копирование), первые экстенты файла, данные и указатели ресурсов и указатели к первым данным файла и записи экстента ресурса в файле переполнения экстента. File Record также хранит два 16-байтовых поля, которые используются Finder для хранения атрибутов файла, включая такие вещи, как его код создателя, код типа, окно, в котором должен отображаться файл, и его местоположение в этом окне.

Timestamps

Временные метки всегда поддерживаются в файловой системе, поэтому вы ограничены каким-либо отслеживанием времени, предлагаемым через них (EXT3, EXT4, XFS и т. Д.).

Файловые

Если вам интересно, загляните в тему Википедии под названием « Сравнение файловых систем» . Он содержит самый обширный список файловых систем, о которых я знаю, а также симпатичную таблицу различных функций и состояния того, поддерживается ли он в данной файловой системе.

Ссылки

SLM
источник
Спасибо за обновление, это помогает. На самом деле, я читал здесь, что ext4 может сохранять даты создания, но это еще не было реализовано в ядре.
Terdon
@terdon - да, есть смысл, что некоторые файловые системы будут поддерживать его. Мне кажется, это давно пора, я понимаю в прошлом, почему это было опущено, но с самого начала все продвинулось так далеко, что не имеет смысла явно не иметь этого. Также вы можете отключить поддержку времени доступа, чтобы она могла быть реализована аналогичным образом, а затем отключена, если вы действительно этого не хотели.
SLM
18

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"
Жиль "ТАК - перестань быть злым"
источник
Это зависит от ОС или файловой системы? Это Q & , кажется, подразумевает , что файловая система хранит их , но ядро должно обеспечить способ для доступа к ним.
Тердон
@terdon - смотрите мои обновления.
SLM
@terdon Оба. Если вы задали правильные вопросы и ответы, современные файловые системы уже некоторое время отслеживают время создания. В FreeBSD вы действительно можете получить это из statLinux, системный вызов не был переработан, поэтому вам придется прибегнуть к взлому debugfs.
wingedsubmariner
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
LRI
источник
0
stat -c %Y <filename>

смотреть на man statдля -c(формат) вариантов

Гвидо Рицци
источник