2012-02-28 8 views
8

私は特定の文字列を含むいくつかのファイルがあります。私がしたいのは、ファイルの場所を検索することです。パターンにgrepが存在する場合。真実なら何かをしてください。xargs - 条件とエコー{}

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

問題は、次のとおりです。

  • xargsは、if文で作業されていません。
  • echo {}はファイル名を指定せず、代わりに{}を指定します。

これを修正するにはどうすればよいですか?

+0

'find'実行が'自身をgrep'ていないのはなぜ? –

+0

ファイルやグリップされた行に何かしますか? –

答えて

18

は、このようなシェルを介してコマンドを実行してください:元のコマンドが引用符とbash -cに囲まれてい

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

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 

私はあなたがファイル名をエコー以上のことをしたいと仮定します。

find -iname file.xxx | xargs grep -Fl "string" 
0

まず、ifはbashのコマンドおよび実行可能なプログラムである:それはあなたがやろうとしているすべてのなら、grepのの-lオプションを使用します。一方、xargsには別個のプログラムが必要です。

第2に、;文字があなたのコマンドを分割している可能性があります。あなたはxargsにthrouを得るためにそれらをエスケープする必要があります。すべてこれを避けるために

私は次のことをお勧め:

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

一般的に、forループを使用することは推奨されません。なぜなら、単語を分割する方法はfind-filenamesの出力をスペースで分割するためです。ファイル名を読み出すためにwhileループを使用する方がよいでしょう。 –

+0

良い点。スペースには常に注意してください! – Quota

-1
find -iname file.xxx | while read FILE; do 
if grep -Fq "string" $FILE ; then echo $FILE ; 
done 
+0

この回答は、その長さと内容のために低品質とフラグされていました。それが何をしているのか、それがその質問にどのように答えているのかの説明を追加することを提案する。 –