Команда find
в Linux имеет много опций по сравнению с find
командой в SunOS или Solaris.
Я хочу использовать find
команду следующим образом:
find data/ -type f -name "temp*" -printf "%TY-%Tm-%Td %f\n" | sort -r
Он отлично работает на Linux-машине, но та же команда не имеет опции -printf
на SunOS-машине. Я хочу настроить вывод в "%TY-%Tm-%Td %f\n"
формате.
Пожалуйста, предложите любые альтернативы для SunOS.
shell-script
find
solaris
Пратик Майекар
источник
источник
find
в Solaris, установите пакет findutils .Ответы:
Обратите внимание, что это не имеет ничего общего с Linux; этот
-printf
предикат специфичен для реализации GNUfind
. Linux - это не ОС, это просто ядро, найденное во многих ОС. Хотя в прошлом большинство из этих ОС использовали пользовательское пространство GNU, в настоящее время подавляющее большинство ОС, использующих Linux, являются встроенными и имеют базовые команды, если они есть.Команда GNU
find
, предшествующая Linux, может быть установлена в большинстве Unix-подобных ОС. Он, безусловно, использовался в Solaris (тогда назывался SunOS) до выхода Linux.В настоящее время он даже доступен в виде пакета Oracle для Solaris. На Solaris 11 он есть
file/gnu-findutils
, и команда названаgfind
(для GNUfind
, чтобы отличить ее от собственнойfind
команды системы).Теперь, если вы не можете установить пакеты, вам лучше всего использовать
perl
:Здесь мы все еще используем
find
(реализация Solaris) для поиска файлов, но мы используем его-exec
предикат для передачи списка файловperl
. Иperl
выполняет дляlstat()
каждого метаданные файла (включая время изменения как 10-й элемент ($s[9]
)), интерпретирует его в местном часовом поясе (localtime()
) и форматирует его (strftime()
), который затемprint
отображается вместе с именем файла ($_
это переменная цикла, если ни один из них не указанperl
и не$!
является эквивалентомstderror(errno)
текста ошибки для последнего сбоя системного вызова).источник
ls
типа вывода, см. Спецификацию режима списка в pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.htmlfind
«s-printf
предшествует POSIX.2, так что люди POSIX виноваты здесь. Также обратите внимание, что спецификация POSIX не была общедоступной до 2000-х годов. Я по-прежнему виню людей GNU за то, что они представили ихstat
более десяти лет спустя с другим и худшим синтаксисом для его спецификации формата.Другой способ приблизиться к этому - использовать
find2perl
скрипт, который преобразует (здесь подмножество)find
команды в соответствующий скрипт perl. Скрипт perl используетFile::Find
модуль для выполнения тяжелой работы. Поскольку скрипт find2perl в моей системе не поддерживает-printf
предикат, я добавил его вручную:Для двух примеров файлов, которые я создал, выходные данные одинаковы:
источник