xargs - если условие и эхо {} - PullRequest
10 голосов
/ 28 февраля 2012

У меня есть несколько файлов, которые содержат определенные строки. Что я хочу сделать, это найти местоположение файла; если файл существует grep для шаблона; если правда, сделай что-нибудь.

find -iname file.xxx| xargs -I {} if grep -Fq "string" {} ; then echo {} ; fi

Проблемы:

  • xargs не работает с оператором if.
  • echo {} не дает имя файла, вместо этого выдает {}.

Как мне это исправить?

Ответы [ 3 ]

20 голосов
/ 28 февраля 2012

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

$ find -iname file.xxx |
> xargs -I {} bash -c 'if grep -Fq "string" {} ; then echo {} ; fi'

, где исходная команда была заключена в кавычки и bash -c.

6 голосов
/ 28 февраля 2012

Обернуть оператор if в вызове sh:

find -iname file.xxx | xargs -I {} sh -c 'grep -Fq "string" {} && { echo {}; }'

Использовать цикл while вместо xargs

find -iname file.xxx | while read -r file; do
  if grep -Fq "$file"; then
    # do something
    echo "$file"
  fi
done

Я предполагаю, что вы хотите сделать больше, чем повторитьимя файла.Если это все, что вы пытаетесь сделать, используйте опцию grep -l:

find -iname file.xxx | xargs grep -Fl "string"
0 голосов
/ 28 февраля 2012

Во-первых, if - это команда bash, а не исполняемая программа.С другой стороны, xargs нужна отдельная программа.

Во-вторых, символы ;, вероятно, разделяют вашу команду.Вы должны были бы избежать их, чтобы получить их через xargs.

Чтобы избежать всего этого, я предлагаю следующее:

for i in `find -iname file.xxx` ; do grep -Fq "string" $i && echo $i ; done
...