.txt
すべてのファイルを見つけ、特定の文字列を検索したいとします。私はそれをします:
find ./ -type f -name "*.txt" -exec egrep -iH 'something' '{}' \;
次のようなより複雑なフィルタリングを実行するには、次の手順を実行します。
egrep something file.txt | egrep somethingelse | egrep other
内部で-execを探しますか? (または類似)
必要に応じて簡単に入力できるソリューションを探していることに注意してください。私はシェルスクリプトを使って数行でこれを行うことができることを知っていますが、それは私が望むものではありません。
答え1
findでこれを行う必要がある場合は、シェルを呼び出す必要があります。
find ./ -type f -name "*.txt" -exec sh -c 'grep -EiH something "$1" | grep -E somethingelse | grep -E other' sh {} \;
他の選択肢としては、次のものを使用できますxargs
。
find ./ -type f -name "*.txt" |
xargs -I{} grep -EiH something {} |
grep -EiH somethingelse |
grep -EiH other
または、任意のファイル名を使用する方が安全です(find
サポートしていると仮定-print0
)。
find ./ -type f -name "*.txt" -print0 |
xargs -0 grep -EiH something {} |
grep -Ei somethingelse |
grep -Ei other
あるいは、シェルループを使用することもできます。
find ./ -type f -name "*.txt" -print0 |
while IFS= read -d '' file; do
grep -Ei something "$file" |
grep -Ei somethingelse |
grep -Ei other
done
答え2
編集:この答えは好まないしかし、bashスクリプトの潜在的に危険なトラップを比較して説明するためにここに残しました。
bash
次のコマンドで(または他のシェル)を提供できます-exec
。
find -type -f -name "*.txt" -exec bash -c 'egrep -iH something "{}" | egrep somethingelse | egrep other' \;
これの欠点の1つは、コマンドがより複雑になると参照問題がより重複する可能性があることです。これを防ぐために、for
ループに分割することができます。
for i in $(find -type -f -name "*.txt"); do
if egrep -iH something "$i" | egrep somethingelse | egrep other; then
echo "Found something: $i"
fi
done