Разница в использовании xargs и xargs -i - PullRequest
4 голосов
/ 04 марта 2011

Почему find . -name "*.xml" | xargs grep FOO возвращает совпадения с именами файлов, а find . -name "*.xml" | xargs -i -sh -c "grep FOO {}" - нет?

Ответы [ 3 ]

7 голосов
/ 04 марта 2011

Если это не опечатка при публикации вашего вопроса, не должно быть дефиса до sh:

Причина, по которой вы не получаете имен файлов в выходных данных, заключается в том, что grep запускается с одним файлом в качестве аргумента. Для принудительного вывода имени файла используйте -H.

find . -name "*.xml" | xargs -I {} sh -c "grep -H FOO {}"

Кроме того, -i для xargs устарело в версии 4.2.9. Вы должны использовать -I {}.

4 голосов
/ 12 октября 2013

Как и в предыдущем ответе, разница в том, что grep вызывается для каждого файла, а grep не сообщает имя файла, если в командной строке указан только один файл, если не указан флаг -H (--with-filename)

Почему для каждого файла вызывается grep?Это потому, что ( нравится это или нет ) использование флага -I (или -i) для xargs вынуждает команду запускаться один раз для каждого аргумента, подобно использованию флага "-L 1" для xargs.

со страницы руководства:

   -I replace-str
     Replace occurrences of replace-str in the initial-arguments with names read from
     standard input.  Also, unquoted blanks do not terminate input items; instead the
     separator is the newline character.  Implies -x and -L 1.
0 голосов
/ 14 марта 2013

вы можете просто использовать

find . -name "*.xml" | xargs -I{} grep FOO {}

и вы можете использовать -H или -n в команде grep по мере необходимости.

...