Самый быстрый способ получить время создания и последнего изменения большого количества файлов

Дано

  • каталог
  • шаблон sh, который выдает подмножество файлов непосредственно в этом каталоге (например, *.log)
  • шаблон sh, который может, учитывая имя файла,

Какой самый быстрый способ (в ksh) получить для каждого файла, отфильтрованного по шаблону:

  • его имя
  • дата и время его последнего изменения (т.е. текст добавлен)
  • дата и время, когда он был создан (предположим, что он был создан в каталоге, когда мы к нему обращались)

В идеале это будет работать на обоих:

  • AIX 6100-04-03-1009
  • Linux 2.6.18
  • SunOS 5.10

3 ответа

Узел файловой системы Posix обычно имеет три атрибута времени:

  • atime (время доступа) - когда файл последний раз читался
  • mtime (время модификации) - когда это было в последний раз написано.
  • ctime (время изменения) - когда был изменен его индекс (метаданные).

ctime Атрибут часто неправильно понимается как время создания, а иногда и так, что приводит людей в замешательство.

В оболочках POSIX нет стандартного способа извлечения этих трех атрибутов, и вы будете зависеть от ls команда. ls -l $file по умолчанию показывает время модификации.

  • ls -lc $file шоу ctime
  • ls -lu $file шоу atime

Рекомендуется использовать ls --time-style=full-iso или другой формат ISO для согласованного вывода, если вы находитесь в системе GNU/ Linux.

В Perl и других скриптовых языках легче stat() файл и доступ к его атрибутам. Perl даже имеет -M, -A, а также -C операторы, которые возвращают mtime, atime, а также ctime для объекта файловой системы. Обратите внимание на временной сдвиг, хотя. Perl имеет тенденцию сообщать время относительно времени запуска процесса.

Извиняюсь за то, что не написал для вас awk/sed, но stat Команда предоставит время доступа, изменения и изменения. Это сработает для вас. Я не уверен, что это работает в AIX, у меня нет доступа к этому в настоящее время.

Это может быть расширение GNU, но GNU find имеет форматы printf для всех трех времен, исключая время «рождения». (Для этого требуется Linuxstatxсистемный вызов; текущие версии coreutilsstatможно получить все 4 раза).

      find -printf '%a \t%c \t%t  \t%f\n'

напечатает все 3 раза, как

      Tue Dec  8 07:49:12.3585942200 2020     Tue Dec  8 07:49:27.9582201460 2020     Tue Dec  8 07:49:27.9582201460 2020     ./foo.c

Вы можете использовать%Ak, где k — спецификатор формата, одинаковый для ctime и mtime, для печати в другом формате. См. справочную страницу Linux.

https://www.unix.com/man-page/posix/1p/find/ не упоминает-printfвообще, поэтому вам может понадобитьсяperlили другие инструменты, отличные от POSIX.

Другие вопросы по тегам