
Я знаю команду, которую я использую довольно часто, работая с чужой кодовой базой, вот пример
find ./ -name "*.php" | xargs grep "my_awesome_function("
Я уже прочитал документацию по каждой из команд здесь, как find
, pipe
, xargs
и grep
от
http://www.computerhope.com/unix.htm
Но я все еще не совсем понимаю, как эта команда ищет каждый php-файл из текущего каталога и вниз, а затем ищет, какой из них содержит строку "my_awesome_function(". Я понимаю, как работает часть до конвейера, но после конвейера мое понимание исчезает. Я понимаю, что каждый файл отправляется как аргумент команде grep, может кто-нибудь объяснить, что здесь происходит?
решение1
Попробуйте выполнить find
команду без последней части:
find ./ -name "*.php"
Вы увидите список имен файлов, все из которых заканчиваются на .php
.
Теперь xarg
команда считывает все эти имена файлов из конвейера, берет их кучу (вы можете задать, сколько их, используя option -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("