2016-04-14 3 views
0

だから、ディレクトリ内とその下にあるすべての通常のファイルを見つけなければなりません。これらの正規ファイルのそれぞれについて、パターン($ ARG)に対してegrepを実行し、ファイルの出力がパターン($ ARG)と一致するかどうかを調べる必要があります。シェルディレクトリ内のすべてのファイルでコマンドを使用する方法

私がこれまで持っていると、ファイルのコマンドです:

$count = 0 
file * 

しかし、私はトラブルのegrep & ARG>を/ dev/null /取得を持っています。エコー$?表示される各ファイル(file *)を実行します。

私はファイル*を理解しています。 egrepディレクトリ>/dev/null;エコー$?ファイル内のパターン 'directory'を見つけるために0を出力しますが、パターンが一致するたびにカウンタに1を加えることができるように、各正規ファイルをループするのに問題があります。

答えて

1

質問は明確ではありませんが、パターン

grep -l "pattern" * 2>/dev/null | wc -l 

を含むファイルの数を探しているなら、あなたにそれを与えるだろう。ディレクトリからのエラーは無視されます。

あなたは再帰的に完全なツリーがドットファイルに

grep -r -l "pattern" | wc -l 
+0

サブディレクトリに再帰するには '-r'が必要です。 – Barmar

+0

はい、そうです。 – karakfa

+0

@Aleksej:あなたは私の答えを削除した理由を聞かせてもらえますか?あなたはそれがその質問に対する答えを提供していないと主張しました。私はそれがそうだと思う:OPは特定の問題を解決するためのプログラムを求め、私はそれを掲示した。私のプログラムがOPの要件を満たしていないと思うなら(もちろん、これは可能です - 私はプログラミングでエラーがないとは決して言いませんでした)、代わりにこのエラーを指摘した方が良いでしょう。 – user1934428

0

を含めない場合あなたはこれを試すことができます。

counter=0 
find /path/to/directory/ -type f | \ 
    while read file 
    do 
     if grep -i -e -q "$pattern" "$file" 
     then counter=$((counter+1)) 
     fi 
    done 
echo "$counter" 
+0

whileループがパイプラインにあるので、$ counterはまだ0です。 –

+0

また、 '-e'の引数に' -q'を指定します。 –

+0

-qは、一致すると0で終了を示し、カウンタがインクリメントされます。コードをもっときれいにするためにif else条件の角括弧をスキップしました。 – kintuparantu

0

あなたは隠しファイルを含める場合はhttp://mywiki.wooledge.org/BashFAQ/020

counter=0 
shopt -s globstar nullglob 
for file in **; do 
    grep -qiE "$pattern" "$file" && ((counter++)) 
done 
echo "$counter" 

を参照してください。 、shopt -s dotglob

関連する問題