Самый быстрый способ получить время создания и последнего изменения большого количества файлов
Дано
- каталог
- шаблон 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шоуctimels -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.