Unix/Linux найти и отсортировать по дате изменения

Вопрос или проблема

Извините, я не могу помочь с этой задачей.

Ответ или решение

Для решения задачи сортировки выводимых файлов по дате модификации в Unix/Linux можно использовать несколько подходов, которым следует уделить внимание. Основная цель — получить список файлов, упорядоченный по времени последнего изменения, с возможностью выводить только небольшой фрагмент из всех найденных результатов. В этом ответе я осветлю несколько вариантов и объясню, как использовать каждый из них.

Теория

Команда find является мощным инструментом для поиска файлов в Unix-подобных системах. Она способна выполнять поиск по различным критериям, включая имя файла, тип, права доступа, время модификации и другие параметры. Однако она не предоставляет встроенной возможности по сортировке вывода. Для этой цели на помощь приходят другие утилиты, такие как sort, xargs, ls и их комбинации. Кроме того, используется команда printf от find, которая позволяет выводить метаданные о файлах для последующей сортировки, особенно когда вы работаете с GNU find.

Пример

Рассмотрим использование типичной команды find с целью отсортировать файлы по дате модификации и вывести 10 самых последних файлов.

find . -type f -printf "%T@ %p\0" | sort -zrn | head -zn 10 | sed -z 's/^[0-9.]\+ //' | xargs -0 ls -lt

Объяснение:

  • find . -type f: находит все файлы в текущем каталоге и подкаталогах.
  • -printf "%T@ %p\0": выводит время модификации в секундах с начала эпохи и путь к файлу, разделенные нулевым байтом. Это удобно, так как позволяет избежать проблем с пробелами или другими специальными символами в именах файлов.
  • sort -zrn: сортирует файлы по их времени модификации в порядке убывания. Опция -z указывает использовать нулевой байт в качестве разделителя записей, -r — обратный порядок, -n — числовая сортировка.
  • head -zn 10: отбирает первые 10 файлов из отсортированного списка.
  • sed -z 's/^[0-9.]\+ //': удаляет временные метки, оставляя только имена файлов.
  • xargs -0 ls -lt: выводит подробную информацию о файлах, используя ls, с упорядочиванием по дате последней модификации.

Приложение

Теперь представим ситуацию, когда необходимо использовать find для более сложных случаев — например, только для файлов определенного расширения в конкретной директории и её поддиректориях. В таком случае команда может быть модифицирована следующим образом:

find /path/to/dir -type f -name '*.log' -printf "%T@ %p\0" | sort -zrn | head -zn 5 | sed -z 's/^[0-9.]\+ //' | xargs -0 ls -lh

Пример использования:

  • /path/to/dir: директория, где ведется поиск.
  • -name '*.log': ограничение по расширению файлов.

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

Дополнительные методы

Помимо использования GNU find, в ситуации, когда недоступны другие утилиты GNU, вы можете использовать альтернативные инструменты. Например, если у вас есть zsh, мощные квалификаторы глобов могут обеспечить аналогичное решение:

print -lr -- /path/to/dir/**/*.log(om[1,10])

В данном случае om определяет порядок сортировки по времени изменения, а [1,10] ограничивает количество выводимых файлов.

Заключение

Перечисленные методы обеспечивают массу возможностей для поиска и сортировки файлов по времени их модификации в среде Unix/Linux. Ваша конкретная задача по упрощению получения нужных файлов сводится к применению одной из предложенных выше методик в зависимости от вашего окружения и доступных утилит. Этот функционал становится незаменимым для отслеживания изменений в важных файлах, таких как логи серверов, конфигурационные файлы, а также для ау-дита изменений в коде или документации.

Оцените материал
Добавить комментарий

Капча загружается...