Возможно, вы сможете избавиться от множества старых ядер и связанных файлов initramfs и системных карт :, просто оставив два последних. Предположительно, последний из них — это то, что вы обычно загружаете, а предыдущий может быть полезен для отладки в случае возникновения проблемы.
Единственный интерфейс POSIX CLI (и утилиты )для системных вызовов lstat()
и stat()
ls
Боюсь, и его вывод не может быть -надежно обработан.
Уловка может состоять в том, чтобы использоватьpax -x ustar
(как команду pax
, так и ее формат ustar
, указанные )для создания файла tar
с файлом в нем и извлечения метки времени из файла.
echo "$((0$(pax -x ustar -wd -- "$file" |
dd 2> /dev/null bs=4 skip=34 count=3 | tr -d '\0')))"
mtime
сохраняется по смещению 136 как восьмеричное число.
Однако он обременен всеми ограничениями формата US -tar.
Для переноса лучше всего использовать perl
илиpython
:
perl -MPOSIX -le '
for (@ARGV) {
if (@s = lstat$_) {print $s[9]} else {warn "$_: $!\n"}
}' -- "$file"
(отмечают, что он не включает наносекунду, доступную во многих современных системах. Вы можете получить его, например, через модуль Time::HiRes
, но это предполагает, что он установлен и относится к последней версии ).
Если вы используете ОС, совместимую с POSIX (, как следует из вашего вопроса ), есть хороший способ сделать это с помощью pax
, который позволяет получить даже доли секунды.
Звонок:
pax -xpax -wd -- "$file" | dd 2> /dev/null skip=1 count=1 |
grep ' mtime=' | sed 's/.*mtime=//'
Если я позвоню:
pax -xpax -wd -- /etc/passwd | dd 2> /dev/null skip=1 count=1 |
grep ' mtime=' | sed 's/.*mtime=//'
Я понял:
1572569707.797017689
Это довольно просто реализовать, но вот вариант, использующий python.
#-- cross-platform workaround, see https://unix.stackexchange.com/q/561927/3097
alias stat_mtime='python -c "print(__import__(\"os\").stat(__import__(\"sys\").argv[1]).st_mtime)"'
$ stat_mtime /dev/null
1624731195.3483574