Как мне включить трубу | в моем linux найти команду -exec? - PullRequest
189 голосов
/ 21 ноября 2008

Это не работает. Можно ли это сделать в find? Или мне нужно xargs?

find -name 'file_*' -follow -type f -exec zcat {} \| agrep -dEOE 'grep' \;

Ответы [ 4 ]

238 голосов
/ 21 ноября 2008

решение простое: выполнить через sh

... -exec sh -c "zcat {} | agrep -dEOE 'grep' " \;
131 голосов
/ 21 ноября 2008

Задача интерпретации символа канала как инструкции для запуска нескольких процессов и передачи вывода одного процесса на вход другого процесса является обязанностью оболочки (/ bin / sh или эквивалентной).

В вашем примере вы можете выбрать использование оболочки верхнего уровня для выполнения трубопровода следующим образом:

find -name 'file_*' -follow -type f -exec zcat {} \; | agrep -dEOE 'grep'

С точки зрения эффективности этот результат стоит одного вызова find, многочисленных вызовов zcat и одного вызова agrep.

Это приведет к тому, что будет создан только один agrep-процесс, который обработает весь вывод, полученный при многочисленных вызовах zcat.

Если по какой-то причине вы хотите вызывать agrep несколько раз, вы можете сделать:

find . -name 'file_*' -follow -type f \
    -printf "zcat %p | agrep -dEOE 'grep'\n" | sh

Это создает список команд, использующих каналы для выполнения, а затем отправляет их новой оболочке для фактического выполнения. (Пропуск финального «| sh» - хороший способ отладки или выполнения пробных запусков командных строк, подобных этой.)

С точки зрения эффективности этот результат стоит одного вызова find, одного вызова sh, многочисленных вызовов zcat и многочисленных вызовов agrep.

Наиболее эффективным решением с точки зрения количества вызовов команд является предложение от Пола Томблина:

find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'

... который стоит один вызов find, один вызов xargs, несколько вызовов zcat и один вызов agrep.

16 голосов
/ 21 ноября 2008
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'
8 голосов
/ 18 сентября 2010

Вы также можете перенаправить в цикл while, который может выполнять несколько действий с файлом, который находится find. Итак, вот один для поиска в jar архивах для данного файла класса java в папке с большим дистрибутивом jar files

find /usr/lib/eclipse/plugins -type f -name \*.jar | while read jar; do echo $jar; jar tf $jar | fgrep IObservableList ; done

ключевым моментом является то, что цикл while содержит несколько команд, ссылающихся на переданное имя файла, разделенных точкой с запятой, и эти команды могут включать в себя каналы. Таким образом, в этом примере я отображаю имя соответствующего файла, затем перечисляю, что находится в архивной фильтрации для данного имени класса. Вывод выглядит так:

/ USR / Lib / Затмение / плагины / org.eclipse.core.contenttype.source_3.4.1.R35x_v20090826-0451.jar /usr/lib/eclipse/plugins/org.eclipse.core.databinding.observable_1.2.0.M20090902-0800.jar орг / затмение / ядро ​​/ привязки / наблюдаемый / список / IObservableList .class /usr/lib/eclipse/plugins/org.eclipse.search.source_3.5.1.r351_v20090708-0800.jar /usr/lib/eclipse/plugins/org.eclipse.jdt.apt.core.source_3.3.202.R35x_v20091130-2300.jar /usr/lib/eclipse/plugins/org.eclipse.cvs.source_1.0.400.v201002111343.jar /usr/lib/eclipse/plugins/org.eclipse.help.appserver_3.1.400.v20090429_1800.jar

в моей оболочке bash (xubuntu10.04 / xfce) действительно делает совпадающее имя класса жирным, поскольку fgrep выделяет совпадающую строку; это позволяет легко сканировать список сотен jar файлов, в которых был произведен поиск, и легко видеть любые совпадения.

на окнах вы можете сделать то же самое с:

for /R %j in (*.jar) do @echo %j & @jar tf %j | findstr IObservableList

обратите внимание, что в Windows разделителем команд является '&' not ';' и что '@' подавляет эхо команды, чтобы выдать аккуратный вывод точно так же, как вывод linux find выше; хотя findstr не делает сопоставленную строку жирным шрифтом, поэтому вам нужно взглянуть немного ближе к выводу, чтобы увидеть имя сопоставленного класса. Оказывается, команда windows 'for' знает несколько хитростей, таких как циклический просмотр текстовых файлов ...

1025 * наслаждаться *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...