Обратите внимание, что это не имеет ничего общего с Linux; этот предикат -printf
специфичен для реализации GNU find
. Linux - это не ОС, это просто ядро, которое есть в ряде ОС. Хотя в прошлом большинство этих ОС использовали пользовательскую среду GNU, теперь подавляющее большинство ОС, использующих Linux, являются встроенными и имеют базовые команды, если они есть.
Команду GNU find
, предшествовавшую Linux, можно установить на большинство Unix -подобных операционных систем. Он определенно использовался в Solaris (под названием SunOS тогда )до выхода Linux.
В настоящее время он доступен даже в виде пакета Oracle для Solaris. В Solaris 11 это находится в file/gnu-findutils
, и команда названаgfind
(для GNU find
, чтобы отличить ее от собственной системной команды find
).
Теперь, если вы не можете установить пакеты, лучше всего использоватьperl
:
find data/ -type f -name "temp*" -exec perl -MPOSIX -le '
for (@ARGV) {
unless(@s = lstat($_)) {
warn "$_: $!\n";
next;
}
print strftime("%Y-%m-%d", localtime($s[9])). " $_";
}' {} + | sort -r
Здесь мы все еще используемfind
(реализацию Solaris )для поиска файлов, но мы используем ее предикат -exec
для передачи списка файлов в perl
. И perl
выполняет lstat()
для каждого из них для извлечения метаданных файла (, включая время модификации в качестве 10-го элемента ($s[9]
)), интерпретирует его в местном часовом поясе(localtime()
)и форматирует (strftime()
), который затем print
s рядом с именем файла($_
— это переменная цикла, если она не указана в perl
, а $!
эквивалентно stderror(errno)
— тексту ошибки для последнего сбоя системного вызова ).