it-swarm-eu.dev

Jak spustit find -exec?

Chtěl bych najít soubory v aktuálním adresáři, které obsahují text „chrome“.

$ find . -exec grep chrome
find: missing argument to `-exec'

Co dělám špatně?

538
ripper234

Zmeškali jste ; (unikl zde jako \;, aby se zabránilo Shell v jeho interpretaci) nebo + a {}:

find . -exec grep chrome {} \;

nebo

find . -exec grep chrome {} +

find provede grep a nahradí {} s nalezeným jménem (názvy). Rozdíl mezi ; a + je to s ; je proveden jediný grep příkaz pro každý soubor, zatímco s + tolik souborů, jak je to možné, je dáno jako parametry pro grep najednou.

801
bmk

K tomu vůbec nemusíte používat find; grep je schopen zpracovat otevírání souborů buď z globálního seznamu všeho v aktuálním adresáři:

grep chrome *

... nebo dokonce rekurzivně pro složku a vše pod ní:

grep chrome . -R
51
Caleb
find . | xargs grep 'chrome'

můžete také:

find . | xargs grep 'chrome' -ls

První zobrazuje řádky v souborech, druhý pouze zobrazuje soubory.

Calebova volba je hezčí, méně úhozů.

20
Mathew

Najít je jeden způsob a můžete zkusit the_silver_searcher pak stačí jen udělat

ag chrome

Bude prohledávat chrome ve všech souborech (včetně podadresářů) a je rychlejší než najít

7
Ask and Learn

Zde je příklad toho, jak obvykle používám find/exec ...

find  . -name "*.py" -print -exec fgrep hello {} \;

Toto rekurzivně hledá všechny soubory .py a pro každý soubor vytiskne název souboru a fgrep pro „hello“ v tomto (pro každý) soubor. Výstup vypadá (právě spuštěn dnes):

./r1.py
./cgi-bin/tst1.py
print "hello"
./app/__init__.py
./app/views.py
./app/flask1.py
./run.py
./tst2.py
print "hello again"
5
jon

Chcete-li zobrazit seznam souborů místo řádků:

grep -l "chrome" *

nebo:

grep -r -l "chrome" .
3