Формат даты UNIX ls -l варьируется - PullRequest
0 голосов
/ 08 ноября 2018

Я использую SunOS 5.10. Я хотел бы, чтобы содержимое "ls -l" было направлено в файл, который можно прочитать в базу данных. Однако формат времени меняется. Ниже приведен пример вывода ls -l. Почему файлы ls_txt.sh и nohup.out имеют метку времени, а не год?

-rw-rw-r--   1 gilmog   other         57 Jul 25  2017 fnd2.txt
-rw-rw-r--   1 gilmog   other        702 Jan 24  2018 handySh
-rw-rw-r--   1 gilmog   other        189 Nov  7 23:20 ls_txt.sh
-rw-------   1 gilmog   other       3915 Sep 12 03:58 nohup.out
-rw-rw-r--   1 gilmog   other       1655 Jan 24  2018 npiFn.sas  

1 Ответ

0 голосов
/ 08 ноября 2018

Внимание: не анализируйте вывод ls. Его вывод предназначен для потребления человеком , чтобы понять содержимое файловой системы. Если вы хотите, чтобы программа знала информацию о времени файла, используйте stat 1 .


Теперь, со всем этим, я отвечу на ваш вопрос. Время меняется, потому что так определено работать. Из документации POSIX по ls:

Поле должно содержать соответствующую дату и метку времени последнего изменения файла. В локали POSIX это поле должно быть эквивалентно выводу следующей команды даты:

date "+%b %e %H:%M"

, если файл был изменен за последние шесть месяцев, или:

date "+%b %e %Y"

(где используются два символа между% e и% Y), если файл не был изменен в течение последних шести месяцев или если дата модификации находится в будущем, за исключением того, что в обоих случаях окончательный результат производится по дате не должны быть включены, и выходные данные должны быть такими, как если бы команда date была выполнена во время последней даты изменения файла, а не в настоящее время. Когда категория языкового стандарта LC_TIME не установлена ​​на языковой стандарт POSIX, может использоваться другой формат и порядок представления этого поля.

Это определение создает ужасную путаницу для анализа программы. Итак, повторюсь: не анализировать ls вывод.


1 Если у вас нет stat на вашей коробке Solaris, то вам, возможно, просто придется положиться на ls. Мне жаль. Команда для этого примерно равна ls -siv -@ -/ c -%all z.

...