Почему в выводе ls некоторые файлы показывают время, а другие — год, и как это исправить?
При работе с командой ls -l
в Linux (например, в Debian Stable) нередко возникает ситуация, когда в списке файлов одни файлы показывают время модификации (часы и минуты), а другие — год. Например:
-rw-r--r-- 1 user user 2.0K Sep 5 14:04 filename1
-rw-r--r-- 1 user user 3.5K Sep 7 2025 filename7
Почему возникает такое поведение и как сделать вывод более единообразным? Разберёмся простыми словами и приведём способы решения.
Проблема: почему ls показывает либо время, либо год?
По умолчанию команда ls -l
использует так называемый компактный формат времени. При этом:
- Если файл был изменён в течение последних 6 месяцев (относительно текущей даты), в столбце времени показываются часы и минуты.
- Если файл был изменён более 6 месяцев назад или изменение происходит в будущем (по времени), вместо времени выводится год.
Это сделано для удобочитаемости: недавно изменённые файлы показывают точное время изменения, а у старых указывается год, чтобы не перегружать информацию.
Так, файл с датой изменения Sep 7 14:04
был отредактирован недавно, а с датой Sep 7 2025
— более полугода назад или изменение записано в будущую дату.
Причина показа года у некоторых файлов: «датa в будущем» и системные часы
Интересный нюанс: если время модификации файла находится в будущем относительно системного времени (например, часы на компьютере были изменены, или файл пришёл из другой машины с неправильной датой), ls
тоже показывает год вместо времени.
Иными словами, например, из-за проблем с системными часами, файловая система или удалённые устройства могут «представлять» файлы с будущими датами изменения. Это приводит к тому, что ls
выводит год даже для недавно появившихся файлов.
Как сделать вывод времени в ls однородным?
Если хочется видеть даты и время в одном формате для всех файлов, а не смешивать часы и годы, можно использовать опцию --time-style
. Она позволяет явно задать формат даты и времени, используя спецификаторы, аналогичные команде date
.
Пример: вывести дату и время всегда с точностью до секунд, без переключения между годом и временем:
ls -ltrh --time-style="+%d-%b-%Y %H:%M:%S"
Такой формат выведет даты так:
-rw-r--r-- 1 user user 2.0K 07-Sep-2025 14:04:23 filename1
-rw-r--r-- 1 user user 3.5K 07-Sep-2025 15:12:04 filename7
В этом случае вы всегда будете видеть полную дату и время, что удобно для однородного восприятия.
Другие советы и варианты решения
- Вариант 1: Использовать
--time-style
— универсальный и удобный способ, не требует менять системные настройки. - Вариант 2: Исправить системное время — если у вас есть файлы с датой в будущем, лучше проверить и синхронизировать системные часы (например, с помощью NTP), а также убедиться, что часовой пояс настроен правильно. Это исключит появление «файлов из будущего».
Обратите внимание, что дата с годом появляется по правилу, если файл модифицирован либо более 6 месяцев назад, либо в будущем относительно текущей даты на вашей системе.
Краткие рекомендации
- Для единообразного отображения даты и времени используйте
ls -l --time-style="+%d-%b-%Y %H:%M:%S"
- Для устранения ошибок с датами «в будущем» проверьте корректность системных часов и часового пояса
- Если в скриптах вы разбираете вывод
ls -l
— учитывайте, что поле с временем может быть либо часами, либо годом, и это нормально для стандартного поведения команды.
Таким образом, поведение ls
при отображении времени — стандартное и продуманное, но его можно настроить под свои нужды либо устранить системные несоответствия с датой.