Помогите пониманию 'найти' синтаксис на Солярисе

Приложения KDE записаны с помощью QT, таким образом, необходимо использовать спокойный инструмент конфигурирования (пакет qt4-qtconfig в Debian/Ubuntu)

2
14.06.2012, 13:01
2 ответа

Стандарт POSIX для находки управляет, только передает под мандат изолированное {}, чтобы быть замененным именем файла и только первым. Используя {}/start.ksh приведите к неуказанному поведению.

Аргумент, содержащий только эти два символа "{}", должен быть заменен набором агрегированных путей с каждым путем, переданным как отдельный аргумент вызванной утилите в том же порядке, что это было агрегировано. Размер любого набора двух или больше путей должен быть ограничен таким образом, что выполнение утилиты не заставляет систему {ARG_MAX} предел быть превышенной. Если больше чем один аргумент, содержащий только эти два символа "{}", присутствует, поведение является неуказанным.

Если строка utility_name или аргумента содержит эти два символа "{}", но не только эти два символа "{}", она определяется реализацией, находят ли замены теми двумя символами, или использует строку без изменения.

Один способ сделать, что Вы хотите с находкой Соляриса, состоял бы в том что команда:

find findtest -name "test[1-4]" -exec sh -c 'md5sum $1/start.ksh' foo {} \;

Более быстрый путь был бы:

find findtest -name "test[1-4]" -exec sh -c 'for i; do md5sum "$i/start.ksh"; done' foo {} + 
4
27.01.2020, 22:01
  • 1
    Спасибо за место на ответе. Мне очень было бы интересно знать, почему Ваша вторая команда быстрее, чем первое? Это ksh конкретный или действительно ли это - то же на всех оболочках? –  rahmu 14.06.2012, 15:53
  • 2
    @rahmu Это быстрее, потому что это связывает все аргументы и выполняет их на единственной сессии оболочки, вместо того, чтобы создать новую сессию оболочки для каждого аргумента. –  Chris Down 14.06.2012, 16:29
  • 3
    @rahmu Вот именно. + разделитель эквивалентен, но более прост, чем использование xargs. Нет ничего ksh, конкретного в командах, которые я предложил, они будут работать с наследием/bin/sh, ударом или ksh. –  jlliagre 14.06.2012, 17:14
  • 4
    Ах да. Я запутался for i;. Это - то, что я подозревал, чтобы быть конкретной оболочкой. Для проверки я разобрался в нем, это просто неявный способ записать for i in $*? –  rahmu 14.06.2012, 18:02
  • 5
    , Это почти эквивалентно. Более точно, это неявный способ записать for i in "$@" –  jlliagre 15.06.2012, 01:57
  • 6
    , Это почти эквивалентно. Более точно, это неявный способ записать for i in "$@" –  jlliagre 15.06.2012, 01:57
  1. На самом деле Ваша оболочка расширяется test[1-4] прежде чем это вызовет find. Необходимо выйти из него с '…'
  2. {} рассматривается как шаблон только, когда это - отдельный маркер

-exec самостоятельно обычно costy и рекомендован использоваться любой с запаздыванием +, или избегаемый в пользу питания xargs.

Я знаю, что могу использовать для цикла как это, но мне любопытно знать, может ли он быть сделан в, каждый находит вызов:

find findtest -name 'test[1-4]' -print0 | xargs -0I{} -- md5sum '{}/start.ksh' — выполнения md5sum эффективно — со всеми именами файлов, данными сразу.

0
27.01.2020, 22:01
  • 1
    Это не будет работать над Солярисом. Ваша находка и команды xargs нестандартны совместимый при помощи Gnuisms. –  jlliagre 14.06.2012, 17:18
  • 2
    @jlliagre, ОРЛИ? Как делает это хорошо работает для меня на SunOS solaris 5.11 11.0 i86pc i386 i86pc, затем? –  poige 14.06.2012, 17:26
  • 3
    Это действительно работает над Солярисом 11, потому что у Вас есть/usr/gnu/bin сначала в Вашем ПУТИ. rahmu очень вероятно использует Солярис 10 или более старый, которые не связываются, гну находят и xargs. Иначе find findtest -name test[1-4] -exec md5sum {}/start.ksh \; имел бы работу во-первых. –  jlliagre 14.06.2012, 17:53
  • 4
    Предоставленный. find ... -print0 и xargs -0 Gnuisms были интегрированы в Солярисе 11 стандартных команд для улучшения пользовательского знакомства. Я должен перефразировать свой комментарий, "Это не будет работать над Солярисом 10 или более старый, который является тем, что использует rahmu". –  jlliagre 15.06.2012, 02:45
  • 5
    Никакая проблема для Пользователей Solaris, у которых на самом деле было надежное решение с 1992 (сначала реализованный David Korn в 1988 на SVR4.0). in-ulm.de/~mascheck/various/find/dgk-20010326.html –  jlliagre 15.06.2012, 10:24

Теги

Похожие вопросы