Преобразование DateFormat

Используйте /etc/paths.d . Основная причина в том, что / etc / paths будут изменены и / или заменены обновлениями системы. /etc/paths.d/ элементов не будет. Файлы обычно именуются шаблоном index-source . Например, 99-mypaths . Пути добавляются в порядке *. Намного проще просто добавить / удалить файл, чем программно редактировать его идемпотентно без ошибок.

По умолчанию csh.login , профиль и zprofile в macOS все загружают path_helper .


* Возможно, в порядке ASCII, но, возможно, в ЛОКАЛЬНОМ порядке.

1
09.11.2016, 18:22
2 ответа

Несколько замечаний по синтаксическому анализу вывода ls :

  • формат зависит от локали. Если вам нужно разобрать его, вам нужно исправить языковой стандарт на что-то известное, обычно C
  • в выводе ls -l , поскольку имя пользователя и имя группы появляются перед датой и может содержать пробелы (хотя на практике это редко), вы не можете рассчитывать, что дата всегда будет в 6-м поле. Лучше использовать ls -n , чтобы использовать числовой uid / gid (или -o , -g с реализациями, в которых они есть).
  • если файл относится к типу каталога, ls -l file перечислит его содержимое. Вам нужна опция -d (на данный момент LC_ALL = C ls -nd - "$ file" ).
  • если имя файла (или цель символической ссылки для файлов типа символическая ссылка) содержит символы новой строки, то вам нужно убедиться, что вы учитываете только первую строку вывода

     LC_ALL = C ls -nd - "$ file" | awk '{выведите 6, 7, 8 долларов; exit} '
     
  • В локали C формат времени модификации меняется в зависимости от того, был ли файл изменен в последний раз за последние 6 месяцев или нет (или в будущем). Таким образом, вы можете получить 14 июня, 09:18 или 4 февраля 2014 г. или 1 января 2017 г. , если запускается 09.11.2016. Если год не указан, вы не можете считать, что год является текущим годом. Например, если вы запустите его в январе и получите Dec 24 23:59 , это декабрь прошлого года.

Это все еще можно решить следующим образом:

LC_ALL=C ls -dn -- "$file" | awk -v now="$(date +%m:%Y)" '{
  m=$6; d=$7; y=$8
  m = index("--JanFebMarAprMayJunJulAugSepOctNov", m) / 3
  if (y ~ /:/) {
    split(now, a, ":")
    y = a[2]
    if (m > a[1]) y--
  }
  printf "%02d/%02d/%04d\n", d, m, y
  exit}'

Но лучше всего было бы получить время в правильном формате с самого начала.С zsh вы можете использовать его встроенную stat :

zmodload zsh/stat
stat -LF %d/%m/%Y +mtime -- $file

В системе GNU вы можете сделать:

date -r "$file" +%d/%m/%Y

(хотя для символических ссылок это дает вам время модификации цель).

или:

find -- "$file" -prune -printf '%Td/%Tm/%TY\n'

на BSD:

stat -t %d/%m/%Y -f %Sm -- "$file"

Или использование perl для переносимости:

perl -MPOSIX -le '@s = lstat shift or die "lstat: $!";
  print strftime "%d/%m/%Y", localtime $s[9]' -- "$file"
2
27.01.2020, 23:34

Если вы хотите использовать ls , вы можете сделать это : ls -l --time-style = +% d /% m /% Y

0
27.01.2020, 23:34

Теги

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