UNIX: разница xargs и exec

Я пытаюсь найти строку "rGEO" в каталоге, используя следующие команды:

find . -name "*" -type f -print | xargs grep "rGEO" 
./home/oper1/AgencyTape/geo/exe/gngeo.cmd:${WEB_DIR}/exe/web_reports.sh -aGN -d${prev_ccyy}${prev_mm} -rGEO -nomail

В этом случае я возвращаю имя файла с соответствующей строкой, а также строку, соответствующую приведенной выше строке.

find . -name "*" -type f -exec grep "rGEO" {} \;

В этом случае я возвращаюсь:

${WEB_DIR}/exe/web_reports.sh -aGN -d${prev_ccyy}${prev_mm} -rGEO -nomail

Файл, содержащий строку, не печатается, и, как вы можете видеть, между двумя выходными данными есть большая разница.

Использование xargs дает более четкий и точный вывод.

Мой вопрос: в чем разница между двумя командами? Мне кажется, что они выполняют одну и ту же логику, но получают разные результаты.


person user1867151    schedule 30.11.2012    source источник
comment
Не совсем дубликат Что быстрее, 'find -exec' или «найти | xargs -0'?, так как это спрашивает о различиях, а этот вопрос спрашивает о том, что быстрее, но разница в том, что xargs вызывает команду пакетами, а find -exec вызывает команду один раз для каждого результата, что делает xargs быстрее.   -  person Adam Katz    schedule 13.02.2016
comment
Более того: find -exec практически идентичен find -print0 |xargs -0n1, поскольку -n1 обеспечивает один вызов для каждого результата.   -  person Adam Katz    schedule 13.02.2016


Ответы (2)


what is the difference between the two commands? To me, they seem to be performing the same logic, but getting different results.

Ниже приведено одно важное различие между xargs и exec:

find . -name "*.c" -exec ls -al {} \; выполняет команду ls -al для каждого отдельного файла.

find . -name "*.c" | xargs ls -al создает список аргументов из вывода команды find и передает его в ls.

рассмотрите приведенный ниже вывод команды find:

a.c
b.c
c.c

первая команда (exec) будет выполняться

ls -l a.c
ls -l b.c
ls -l c.c

но второй (xargs) будет выполняться

ls -l a.c b.c c.c

Надеюсь это поможет.

person neo    schedule 13.10.2014

Добавление -print также вернет имя файла, хотя и немного по-другому.

find . -name "*" -type f -exec grep "rGEO" {} \; -print

Я не знаю о внутренней работе, вот чем она отличается. Предположим, что команды find находят 2 файла a.txt и b.txt.

-exec будет работать на них вроде.

grep "rGEO" a.txt
grep "rGEO" b.txt

однако xargs будет работать как ..

grep "rGEO" a.txt b.txt.

Надеюсь, поможет

person ghitesh    schedule 25.12.2012