Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > *nix > Про конвейер в shell


Автор: alkor 09.09.02, 13:24
Господа, у меня следующий вопрос.
Сначала я ищу файлы в /usr/lib с расширением *.о:

find '/usr/lib' -type f -iname '*.o' | more

Затем я хочу послать все это на ввод команды nm, которая читает объектники:

find '/usr/lib' -type f -iname '*.o' | nm

- ничего не получается - результат такой как будто я ввел просто одну команду
безаргументов.

Может что-то нетак. Буду очень благодарен подсказкам.
Спасибо!




Автор: makedonskij 09.09.02, 17:22
find '/usr/lib' -type f -iname '*.o' -exec nm {} \;

100\% толко что проверил.

-exec вызывает для каждого найденного файла nm
{} держателль места для каждого найденного файла
\; обязателное окончание при -exec '\' маскирует ';'

man find

Автор: borunov 10.09.02, 08:15
Способ "find '/usr/lib' -type f -iname '*.o' -exec nm {} \;" хорош, но есть и альтернативный подход, который сработает быстрее на большом количестве файлов за счет того, что "nm" будет вызываться не для каждого аргумента, а для групп аргументов:

find '/usr/lib' -type f -iname '*.o' | xargs nm

ключевая фишка здесь - прога xargs. Не уверен, что она есть на всех юниксах - отсюда могу проверить только HP-UX 11.0 - работает отлично. По-умолчанию xargs группирует так, чтоб не превысить ARG_MAX и LINE_MAX, но можно в командной строке сказать, по сколько аргументов объединять с помощью опций -n, -l, -x...

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)