Полная дата файла (без утилит GNU)

Один из способов сделать это с помощью оболочки:

for f in *; do
    mv -- "$f" "${f%.key*}.key"
done
2
16.01.2016, 01:37
3 ответа

С помощью ls, хотя вы не всегда сможете получить время, вы должны быть в состоянии получить дату (год, месяц и день месяца).

В локали C вывод даты в ls -l должен быть либо Mmm dd HH:MM для недавних файлов (и вы должны быть в состоянии вывести год (либо этот год, либо предыдущий) или Mmm dd YYYY для старых файлов или файлов с временем модификации в будущем. Таким образом, вы всегда сможете получить дату (YYYY-mm-dd) из этого:

eval "$(date +'year=%Y month=%m')"
LC_ALL=C ls -dn file | awk -v y="$year" -v m="$month" '{
  month = index("--JanFebMarAprMayJunJulAugSepOctNovDec", $6) / 3
  day = $7
  if ($8 ~ /:/)
    year = y - (month > m)
  else
    year = $8
  printf "%04d-%02d-%02d\n", year, month, day
  exit}'

Теперь, если вам нужно полное время модификации с максимальной точностью, боюсь, что для этого нет стандартной команды.

Вы можете найти некоторые реализации ls, которые имеют опции для этого (ls --full-time в GNU ls или -... D <формат> с FreeBSD ls, например)

Существует ряд различных и несовместимых реализаций команды stat (IRIX, zsh builtin, GNU, BSD), которые могут дать вам это.

Или вы можете использовать -printf предикат GNU find. Или опцию -r GNU date.

Не все реализации дадут вам субсекундную детализацию. Остерегайтесь часовых поясов и DST, поскольку в зависимости от выбранного формата и часового пояса, в котором вы находитесь, данный вывод может быть неоднозначным и относиться к более чем одной возможной дате.

Для симлинков вы также можете спросить себя, какое время модификации ссылки или ее цели вам нужно. Некоторые из упомянутых здесь опций будут делать то или другое по умолчанию, а некоторым из них можно приказать делать то или другое по требованию.

  • zsh stat: stat -F '%Y-%m-%d %T.%N %z' +mtime file
    1992-05-13 14:57:00.123368710 +0100
  • GNU stat stat -c %y file
    1992-05-13 14:57:00.123368710 +0100
  • BSD stat: stat -t '%F %T %z' -f %Sm file
    1992-05-13 14:57:00 +0100
  • IRIX stat: stat -m file
  • GNU find: find file -prune -printf '%TF %TT %Tz\n'
    1992-05-13 14:57:00.1233687100 +0100
  • GNU date: date -r file '+%F %T.%N %z'
    1992-05-13 14:57:00.123368710 +0100
  • FreeBSD ls: ls -D '[%F %T %z]' -l file
    -r-xr-xr-x 2 bin bin 372298 [1992-05-13 14:57:00 +0100] file
  • GNU ls: ls --full-time -l file
    -r-xr-xr-x 2 bin bin 372298 1992-05-13 14:57:00.123368710 +0100 file
  • ast-open ls: ls -Z '%(mtime:time=%F %T.%N %z)s'
    1992-05-13 14:57:00.123368710 +0100

AIX, которую, судя по вашему ls синопсису, вы используете, имеет команду istat (AIX 5. 3 man page), которая отображает даты полностью (без субсекундной детализации, и неоднозначно, если вы не заставите TZ заменить UTC0), хотя ее не так легко разобрать:

$ LC_ALL=C TZ=UTC0 istat file
Inode 10360 on device 10/6    File
Protection: r-xr-xr-x
Owner: 2(bin)     Group: 2(bin)
Link count: 2     Length 372298 bytes

Last updated:  Wed May 13 14:08:13 1992
Last modified: Wed May 13 13:57:00 1992
Last accessed: Sun Jan 31 15:49:23 1993

Также обратите внимание, что для симлинков вы получите дату цели симлинка, а не самого симлинка.

Если у вас нет доступа ни к одной из этих программ, лучшим вариантом для переносимости может быть perl:

$ perl -MPOSIX -le 'print strftime("%Y-%m-%d %T %z", localtime((lstat(shift))[9]))' file
1992-05-13 14:57:00 +0100

Обратите внимание, что немногие системы имеют время создания для файлов (иногда называемое временем рождения), и нет стандартного API, не говоря уже о команде для запроса, так что ситуация еще хуже, чем со временем модификации.

11
27.01.2020, 21:49

Если у вас есть GNU ls :

ls --time-style=long-iso -l

или

ls --time-style=+FMT -l

, где FMT следует за форматом команды дата . В вашем случае:

ls --time-style=+%Y/%m/%d -l
1
27.01.2020, 21:49

Вот функция POSIX для этого:

mtime() {
   touch -r "$1" /etc/fstab
   diff -u /etc/fstab /dev/null | head -n 1 | cut -f 2
}

Результат:

$ mtime ~/.profile
2019-07-01 06:25:34.000000000 -0500

http://cup.github.io/autumn/util/path/file-mtime

1
27.01.2020, 21:49

Теги

Похожие вопросы