Как включить канал | в мою команду linux find-exec?



Это не работает. Сделать это можно найти? Или мне нужно размер?



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

4 ответов:

работа по интерпретации символа трубы как инструкции для запуска нескольких процессов и передачи вывода одного процесса на вход другого процесса является обязанностью оболочки (/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'

... чего стоит один вызов найти, один вызов команды xargs, несколько вызовов zcat выступает и один вызов agrep.

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

... -exec sh -c "zcat {} | agrep -dEOE 'grep' " \;
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'

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

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

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

/usr/lib/eclipse/plugins / org.затмение.ядро.contenttype.source_3.4.1.R35x_v20090826-0451.сосуд /usr/lib/eclipse/plugins / org.затмение.ядро.привязка данных.observable_1.2.0.M20090902-0800.сосуд орг/затмение/основных/привязка данных/наблюдаемых/список/IObservableList.класс /usr/lib/eclipse/plugins / org.затмение.поиск.source_3.5.1.r351_v20090708-0800.сосуд /usr/lib/eclipse/plugins / org.затмение.JDT, предназначенным.подходящий.ядро.source_3.3.202.R35x_v20091130-2300.сосуд /usr/lib/eclipse/plugins / org.затмение.резюме.source_1.0.400.v201002111343.сосуд /usr/lib/eclipse/plugins / org.затмение.помощь.appserver_3.1.400.v20090429_1800.банку

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

в windows вы можете сделать то же самое с:

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

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

наслаждайтесь

Comments

    Ничего не найдено.