xargs - 如果条件和echo {}

时间:2012-02-28 15:05:59

标签: bash unix if-statement echo xargs

我有一些包含特定字符串的文件。我想要做的是,搜索文件的位置;如果文件存在grep的模式;如果是真的,做点什么。

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

问题是:

  • xargs未使用if语句。
  • echo {}未提供文件名,而是提供{}

如何解决这些问题?

3 个答案:

答案 0 :(得分:19)

尝试通过这样的shell运行命令:

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

原始命令被引号和bash -c包围。

答案 1 :(得分:5)

在对sh:

的调用中包装if语句
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"

答案 2 :(得分:0)

首先,if是一个bash命令,没有可执行程序。另一方面,xargs需要一个独特的计划。

其次,;字符可能会拆分您的命令。你必须逃脱它们才能让它们通过xargs。

为了避免这一切,我建议如下:

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