it-swarm-ru.tech

Как запустить find -exec?

Я хотел бы найти файлы в текущем каталоге, которые содержат текст "хром".

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

Что я делаю неправильно?

538
ripper234

Вы пропустили ; (сбежал здесь как \; для предотвращения интерпретации Shell) или + и ​​{}:

find . -exec grep chrome {} \;

или

find . -exec grep chrome {} +

find выполнит grep и ​​подставит {} с найденными именами файлов. Разница между ; а также + это что с ; выполняется одиночная команда grep для каждого файла, тогда как с + столько файлов, сколько возможно, передается в качестве параметров grep одновременно.

801
bmk

Вам вообще не нужно использовать find; grep может справиться с открытием файлов из списка глобальных файлов в текущем каталоге:

grep chrome *

... или даже рекурсивно для папки и всего, что находится под ней:

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

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

find . | xargs grep 'chrome' -ls

Первый показывает вам строки в файлах, второй просто перечисляет файлы.

Вариант Калеба аккуратнее, меньше нажатий клавиш.

20
Mathew

Найти это один из способов, и вы можете попробовать the_silver_searcher тогда все, что вам нужно сделать, это

ag chrome

Он будет искать chrome во всех файлах (включая подкаталоги) и работает быстрее, чем поиск

7
Ask and Learn

Вот пример того, как я обычно использую find/exec ...

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

При этом выполняется рекурсивный поиск всех файлов .py, и для каждого файла выводится имя файла и fgrep для "привет" в этом (для каждого) файла. Вывод выглядит так (только что запустил сегодня):

./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

Чтобы увидеть список файлов вместо строк:

grep -l "chrome" *

или:

grep -r -l "chrome" .
3
mateusz.szymborski