Самый быстрый способ получить время создания и последнего изменения большого количества файлов
Дано
- каталог
- шаблон 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
Вы можете использовать%A
k, где k — спецификатор формата, одинаковый для ctime и mtime, для печати в другом формате. См. справочную страницу Linux.
https://www.unix.com/man-page/posix/1p/find/ не упоминает-printf
вообще, поэтому вам может понадобитьсяperl
или другие инструменты, отличные от POSIX.