ディレクトリ(およびすべてのサブディレクトリ)のすべてのファイルから文字列を取得しようとしています。ファイルにその文字列がある場合は、他の文字列(この場合は「snake」)が表示される回数を検索して出力したいと思います。また、「蛇」が現れるファイルの行を出力したいと思います。
echo "Files with Reptile:"
find . -type f -name "*.txt" -exec grep -l "Reptile" {} \;
私の課題は、中かっこの後に追加のgrepコマンドを追加する方法です。いくつか試してみましたが、「-exec欠落引数」エラーが発生し続けます。
私はこの発見にあまりにも多くを入れようとしていますか?
ありがとう
答え1
次のことを試すことができます。
$ find . -type f -name "*.txt" -exec sh -c "grep -l "Reptile" {} | xargs -I% grep -Hn snake %" \;
./rep1.txt:2:snake
./rep2.txt:5:another snake
出力にはコロンで区切られたリストが含まれます。ここで、最初の引数はファイル名(引数から-H
)grep
、2番目の引数は目的の用語が表示される行番号(引数から-n
)grep
、3番目の引数は行自体です。
xargs
外部に移動でき、find
以下を提供します。
$ find . -type f -name "*.txt" -exec grep -l "Reptile" {} \; | xargs -i grep -Hn snake {}
(同じ)-i
パラメータは使用されなくなりましたが、便宜上頻繁に使用されます。xargs
-I{}
入力ファイル:
$ tail -n+1 rep*.txt
==> rep1.txt <==
Reptile
snake
iguana
crocodile
==> rep2.txt <==
Reptile
alligator
turtle
another snake
komodo dragon
==> rep3.txt <==
Reptile
lizard
gecko
間違ったファイル名を処理する必要がある場合は、xargsをマージして選択するprint0
こと-0
を検討してください。
答え2
複数の-exec
述語。コマンドが成功した場合にのみ該当するため、-exec
最初のコマンドに対して特別な作業を行う必要はありませんgrep
。
find ... -exec grep -q "Reptile" {} \; -exec grep -Hn snake {} \;
答え3
find . -type f -name "*.txt" -exec sh -c 't=$(mktemp)
for fi
do
if grep -q Reptile "$fi"
then
echo "$fi contains Reptile"
grep snake "$fi" | tee "$t"
echo "snake appeared on $(wc -l < "$t") line(s)"
fi
done
rm -f "$t"
' sh {} +
これは、「snake」という単語が含まれていなくても、単語/文字列「Reptile」を含むファイル名を報告し、「snake」を含む行数を独立して報告します。
こういう質問を間違って読んで、必須だと思いました。取り出すのは簡単です。
find . -type f -exec sh -c '
for fi
do
if grep -q Reptile "$fi"
then
echo "$fi contains Reptile"
grep snake "$fi"
fi
done
' sh {} +
必要に応じて-n
オプションを追加できます。grep snake
これはほとんどすべての有効なファイル名を処理する必要があります。スペースで始まるか、改行文字を含むファイル名に対する他の答えを確認してください。