будет `ls -lt` следовать точным значениям mtimes или только приблизительным значениям mtimes до секунды?

10

ls -lпоказывает только метки времени изменения файлов с точностью до секунды. Если два файла имеют одинаковую временную метку с точностью до секунды, но были изменены не точно в одно и то же время, ls -ltфайлы будут упорядочены в порядке точных значений mtimes или только приблизительных значений mtimes до секунды (и, следовательно, порядок между файлами может быть произвольны)?

Тим
источник

Ответы:

17

Это очень сильно зависит от lsреализации. Из этих 4 найденных в системе GNU / Linux здесь:

$ touch a; touch c; touch b; stat -c %y a c b
2018-01-10 12:52:21.367640342 +0000
2018-01-10 12:52:21.371640148 +0000
2018-01-10 12:52:21.375639952 +0000
  • GNUls , один из проекта GNU (из коллекции coreutils GNU ). Это обычно встречается в системах GNU, таких как Debian (ядра Linux или kFreeBSD), Cygwin или Fedora.

    $ gnu-ls -rt
    a  c  b
    
  • lsОт семейной реликвии Toolchest , порт инструментов OpenSolaris:

    $ heirloom-ls -rt
    a  b  c
    
  • lsИз коллекции AT & T Open Source , возможно , построен в ksh93. Еще один с несколькими необычными расширениями:

    $ ast-ls -rt
    a  c  b
    $ PATH=/opt/ast/bin:$PATH ksh93 -c 'type ls; ls -rt'
    ls is a shell builtin version of /opt/ast/bin/ls
    a  c  b
    
  • busybox (как найдено (или производное) в большинстве (обычно встроенных) Linux-систем):

    $ busybox ls -rt
    c  b  a
    

Итак, из них GNU и ast lsрассматривают дробную вторую часть. Другие прибегают к лексическому сравнению для файлов, которые были изменены в последнюю секунду. Только busybox lsчтит -rтам.

В моих тестах FreeBSD lsтакже поддерживает точность до секунды (при условии, что они включены на уровне VFS, см. vfs.timestamp_precisionSysctl).

zshГлобусы (с классификатором глобуса omдля заказа по времени модификации, Omдля обратного порядка) также занимают полное время:

$ echo *(Om)
a c b

[ file1 -nt file2 ]где поддерживается также, как правило, поддерживают субсекундную гранулярность .

Стефан Шазелас
источник
1
Инструменты не-GNU нарушают POSIX, или это определяет округление для сортировки?
Кевин
2
Что такое аст-лс?
Random832
@ Random832, см. Редактирование.
Стефан Шазелас
2
@Kevin, из моего прочтения спецификации, они не соответствуют этому. AFAICT, в спецификации нет ничего, что позволяло бы игнорировать подсекундную часть, а POSIX предоставляет понятный API для получения точных временных отметок.
Стефан Шазелас
1
@ikkachu, ты прав. Я этого не заметил. см редактировать Это меняет результат для аст.
Стефан Шазелас
4

Что касается lsреализации GNU , то при запуске ls -lбудут упорядочены файлы в алфавитном порядке, а ls -ltфайлы упорядочены в порядке времени изменения, начиная с самого нового, с максимальной точностью, поддерживаемой базовой файловой системой. Вы можете проверить это, используя --full-timeопцию.

Поэтому, чтобы ответить на ваш вопрос, да, в наибольшей степени это возможно, но только тогда, когда вы используете -t(в противном случае по умолчанию используется буквенное обозначение) и используете реализацию, которая его поддерживает (см . Ответ Стефана для получения более подробной информации). Например, ext4может поддерживать точность наносекунд, учитывая достаточно большие inode для хранения требуемых данных временной метки.

Джо
источник
2
Вы должны добавить к своему ответу, что он говорит только о GNU ls. Есть много других реализаций, которые могут вести себя по-другому.
Роланд Иллиг
@RolandIllig добавил
Джо
1

Вы можете проверить, что если вы сравните вывод

ls -lat

и

ls -lat --full-time

в сортировке нет ничего произвольного.

Д'Арси Надер
источник
1

Да, это будет.

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

$ touch aa; sleep 0.2; touch bb

Проверьте время модификации:

$ stat -c %y bb aa
2018-01-07 20:51:19.364248042 0000
2018-01-07 20:51:19.072248226 0000

В списке будет использоваться такая разница:

$ ls -lt aa bb
-rw-r--r-- 1 user user 0 Jan  7 20:51 bb
-rw-r--r-- 1 user user 0 Jan  7 20:51 aa

С --full-timeразницей будет понятно.

$ ls -lt --full-time aa bb
-rw-r--r-- 1 user user 0 2018-01-07 20:51:19.364248042 0000 bb
-rw-r--r-- 1 user user 0 2018-01-07 20:51:19.072248226 0000 aa
Исаак
источник
В последнем блоке, я думаю, у вас есть bbи в aaобратном направлении.
Алекс