ループを使用してファイル内の文字列をチェックする

ループを使用してファイル内の文字列をチェックする

ステートメントで指定された文字列で始まるディレクトリ内のファイルをループ処理しようとしています。ループ内で、ファイル内のforパターン文字列を検索します。ファイル内に文字列が見つかった場合は、を実行します。fooecho$filename

#!/ppp/bash

for filename in $(find ~/filesList -type f -name "pge_*")
do
      #If 'foo' located echo $filename
      
done

ご提案があれば、ぜひお聞かせください。

答え1

find実行に使用しますgrep:

find ~/filesList -type f -name 'pge_*' -exec grep -lF -- foo {} +

-lに一致するものを含むファイル名を一覧表示しますfoo-Fは、式がfoo正規表現ではなく固定文字列として扱われることを意味します。

答え2

find最初の提案 - ループ内でを使用する必要はありませんfor。速度が低下します。代わりに、次のようにすることができます。

for f in ~/filesList/pge_*

かなり重要な注意点は、この簡略化されたバージョンでは バージョンのサブディレクトリが検索される~/filesListのに対しfind、 は検索されないため、実際の使用例によっては簡略化できない可能性があるということです。

これらのファイル内の検索については、次grepのような構造を使用する必要があります。

if (grep needle haystack > /dev/null 2>&1)
then
  echo $f
fi

が探している針を見つけるとgrep、ゼロ以外の値を返すため、条件は TRUE と評価されます。 を使用して、> /dev/null 2>&1の結果が表示されないようにしますgrep。 が干し草の山で針を見つけられない場合grep、戻りコードは 0 であるため、条件は FALSE となり、ステートメントをバイパスしますthen

関連情報