GNU/Linux >> Znalost Linux >  >> Linux

Jak začlením potrubí | v mém linuxovém příkazu find -exec?

Úkolem interpretace symbolu roury jako instrukce ke spuštění více procesů a propojení výstupu jednoho procesu do vstupu jiného procesu je odpovědnost shellu (/bin/sh nebo ekvivalent).

Ve vašem příkladu se můžete buď rozhodnout, že použijete svůj plášť nejvyšší úrovně k provedení potrubí takto:

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

Pokud jde o efektivitu, tyto výsledky stojí jedno vyvolání find, četné vyvolání zcat a jedno vyvolání agrep.

To by vedlo k tomu, že by se vytvořil pouze jediný proces agrep, který by zpracoval veškerý výstup produkovaný četnými voláními zcat.

Pokud byste z nějakého důvodu chtěli agrep vyvolat vícekrát, můžete:

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

Tím se vytvoří seznam příkazů, které se spouštějí pomocí rour, a ty se pak odešlou do nového shellu, aby se skutečně provedly. (Vynechání posledního "| sh" je příjemný způsob, jak ladit nebo provádět suché běhy příkazových řádků, jako je tento.)

Pokud jde o efektivitu, tyto výsledky stojí jedno vyvolání find, jedno vyvolání sh, četné vyvolání zcat a četné vyvolání agrep.

Nejúčinnějším řešením z hlediska počtu vyvolání příkazů je návrh od Paula Tomblina:

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

... což stojí jedno vyvolání find, jedno vyvolání xargů, několik vyvolání zcat a jedno vyvolání agrep.


řešení je snadné:spustit přes sh

... -exec sh -c "zcat {} | agrep -dEOE 'grep' " \;

Linux
  1. Jak najít soubory pomocí příkazu fd v Linuxu

  2. Příkaz Linux:Jak „najít“ pouze textové soubory?

  3. Jak přenést výsledky 'najít' do mv v Linuxu

  1. Jak najít aktivní připojení SSH v systému Linux

  2. Jak používat Su Command v Linuxu

  3. Jak aktualizovat Kali Linux jediným příkazem

  1. Jak používat Linuxový příkaz find k hledání souborů

  2. Jak najdu svou verzi shellu pomocí příkazu Linux?

  3. Jak přejdu pomocí kanálu na příkaz rozdělení Linuxu?