1

Я знаю команду, которую использую довольно часто при работе с чужой кодовой базой, вот пример

find ./ -name "*.php" | xargs grep "my_awesome_function("

Я уже прочитал документы по каждой из приведенных здесь команд, как find , pipe , xargs и grep с http://www.computerhope.com/unix.htm

Тем не менее, я до сих пор не совсем понимаю, как эта команда ищет каждый php-файл из текущего каталога и затем ищет, какой из них содержит строку «my_awesome_function(»). Я понимаю, как работает предварительная часть трубы, но после трубы мое понимание исчезает. Я получаю, что каждый файл отправляется как аргумент в команду grep, может кто-нибудь объяснить, что здесь происходит?

1 ответ1

0

Попробуйте выполнить команду find без последней части:

find ./ -name "*.php"

То, что вы увидите, это список имен файлов, заканчивающихся на .php .

Теперь команды xarg считывают все эти имена файлов из канала, берут их несколько (вы можете установить их, используя опцию -n 2), а затем вызываете аргумент с этими именами. Таким образом, если вывод find - file1.php file2.php file3.php , а xarg сгруппирует не более двух файлов вместе (или вы принудительно сделаете это с помощью xargs -n 2), тогда он вызовет

grep "my_awesome_function(" file1.php file2.php
grep "my_awesome_function(" file3.php

который в свою очередь производит ваш вывод. Вы можете увидеть, что на самом деле происходит, вставив echo:

find ./ -name "*.php" | xargs echo grep "my_awesome_function("

Также поиграйтесь с группировкой:

find ./ -name "*.php" | xargs -n 2 echo grep "my_awesome_function("

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .