GNU/Linux >> Znalost Linux >  >> Linux

Jak zkombinovat hledání a grep pro komplexní hledání? ( GNU/linux, find, grep )

Zkuste

find /srv/www/*/htdocs/system/application/ -name "*.php" -exec grep "debug (" {} \; -print

To by mělo rekurzivně prohledávat složky pod application pro soubory s .php a předejte je grep .

Optimalizací by bylo provedení:

find /srv/www/*/htdocs/system/application/ -name "*.php" -print0 | xargs -0 grep -H "debug ("

Toto používá xargs pro předání všech .php výstup souborů do find jako argumenty pro jeden grep příkaz; např. grep "debug (" file1 file2 file3 . -print0 možnost find a -0 možnost xargs ujistěte se, že mezery v názvech souborů a adresářů jsou správně zpracovány. -H volba předána na grep zajišťuje, že se název souboru vytiskne ve všech situacích. (Ve výchozím nastavení grep vypíše název souboru pouze v případě, že je předáno více argumentů.)

Od man xargs:

-0

      Vstupní položky jsou ukončeny znakem null místo mezerami a uvozovky a zpětné lomítko nejsou speciální (každý znak je brán doslova). Zakáže konec řetězce souboru, se kterým se zachází jako s jakýmkoli jiným argumentem. Užitečné, když vstupní položky mohou obsahovat mezery, uvozovky nebo zpětná lomítka. GNU najde -print0 volba vytváří vstup vhodný pro tento režim.


find není pro tento příklad ani potřeba, lze použít grep přímo (alespoň GNU grep ):

grep -RH --include='*.php' "debug (" /srv/www/*/htdocs/system/application/

a jsme u jediné procesní větve.

Možnosti:

  • -R, --dereference-recursive Read all files under each directory, recursively. Follow all symbolic links, unlike -r.
  • -H, --with-filename Print the file name for each match. This is the default when there is more than one file to search.
  • --include=GLOB Search only files whose base name matches GLOB (using wildcard matching as described under --exclude).
  • --exclude=GLOB Skip any command-line file with a name suffix that matches the pattern GLOB, using wildcard matching; a name suffix is either the whole name, or any suffix starting after a / and before a +non-/. When searching recursively, skip any subfile whose base name matches GLOB; the base name is the part after the last /. A pattern can use *, ?, and [...] as wildcards, and \ to quote a wildcard or backslash character literally.

Linux
  1. Jak používat příkaz „najít“ k hledání více názvů souborů (přípon) v systému Linux

  2. Jak najít a zabít zombie proces v Linuxu

  3. Jak najít konkrétní text pomocí GREP v systému Linux

  1. Jak vyhledávat a odstraňovat adresáře rekurzivně v systému Linux

  2. Jak hledat soubory pomocí regulárního výrazu ve skriptu linuxového shellu

  3. Jak hledat slovo v celém obsahu adresáře v linuxu

  1. Jak najít soubor v Linuxu

  2. Jak hledat soubory podle velikosti a přípony?

  3. Linux – Jak šáhnout po konkrétním slovu a uchopit text?