Замена sed в вопросе удалит все символы после % p
, а не только тире, поскольку [^ K]
является частью совпадающей строки. Вы можете обойти это, захватив символ после % p
с (экранированными) круглыми скобками и вернув его с помощью \ 1
. В sed
:
$ echo '%p %p %pK' | sed 's/%p\([^K]\)/%pK\1/g'
%pK %pK %pK
Хотя вы можете захотеть использовать [^ a-zA-Z]
или аналогичный на тот случай, если вы должны были использовать другие модификаторы для % p
.
Ubuntu использует GNU coreutils stat
, тогда как OSX использует вариант BSD. Итак, в Ubuntu команда немного отличается:
stat -c %Y .bashrc
Из man stat
:
-c --format = FORMAT использовать указанный ФОРМАТ вместо стандартного; выводить новую строку - после каждого использования FORMAT
и:
% Y время последнего изменения данных, секунды с Epoch
Если хотите портативный способ запускать их независимо от ОС, то есть несколько способов сделать это. Думаю, я бы один раз установил для переменной соответствующие параметры:
if uname | grep -q "Darwin"; then
mod_time_fmt="-f %m"
else
mod_time_fmt="-c %Y"
fi
И затем использовал это значение в команде stat
везде, где это необходимо:
stat $mod_time_fmt .bashrc
, поскольку версии stat
для OSX и Ubuntu имеют некоторые отличия в том, что OSX stat
по умолчанию использует краткий вывод, а Linux stat
- подробный, некоторые обручи могут потребоваться быть перепрыгнутым. Одна из возможностей - просто использовать псевдоним в OSX, что заставит stat работать одинаково на обоих.
Если вы не возражаете против установки псевдонима для принудительного вывода подробного вывода stat
в OSX с alias stat = "stat -x"
, тогда вам не нужен perl.
stat .bashrc | grep Modify
- это все, что вам нужно в Ubuntu. если вы установите псевдоним, как указано выше, он также работает под OSX
Пример из Ubuntu 14.04.5 Практически идентичные результаты могут быть получены из Ubuntu 16.04
stat .bashrc| grep Modify
Modify: 2014-03-30 23:14:47.658210121 -0500
Если вам нужна только временная метка, вы можете удалить Измените:
и оставьте остальное с помощью
stat .bashrc | grep Modify | cut -c 9-
Источники:
Это зависит от того, что вы имеете в виду под словом «это». Если вы спрашиваете, существует ли переносимый способ получить mtime
файла с помощью stat (1)
, то нет, его нет. BSD stat (1)
отличается от Linux stat (1)
.
Если вы спрашиваете, существует ли переносимый способ получить mtime
файла, то да, вы можете сделать это с помощью perl (1)
:
perl -e 'print +(stat $ARGV[0])[9], "\n"' file