再帰サポートを追加しようとしています。ファイルグレップスクリプト。
何らかの理由で期待どおりに動作しません。
RECURSIVE_MODE=off
# iterate over args
for ARG in "$@"
do
if [ -d "$ARG" ] && [ $RECURSIVE_MODE = on ] ; then
# recursive call
$0 $GREP_ARGS $ARG/*
elif [ -f "$ARG" ]; then
filecat "$ARG" | grep $GREP_ARGS | sed "s#^#$ARG: #"
else
[ "$ARG" = "-r" ] && RECURSIVE_MODE=on
# append to the current grep args
GREP_ARGS="$GREP_ARGS $ARG"
fi
done
この場合、読みやすくするために関数の使用を避けたいと思います。
編集:スクリプトは次のように動作するはずです。
渡された各パラメーターに対して、以下を行います。
- 現在の引数がディレクトリの場合は再帰モードが有効になっていることを確認し、有効になっている場合は再帰呼び出しを実行します。
- それ以外の場合、現在の引数がファイルの場合、
grep
現在のモードが使用されます。 - それ以外の場合は、現在の引数がgrepパターンまたはgrepスイッチであり、現在の
$GREP_ARGS
リストに追加されたと見なされます。
おそらく、これは完全に信頼できませんが、代替として私にとってはうまくいきますzgrep
。pdfgrep
答え1
-H
次のオプションを試してくださいgrep
。
-H, --with-filename Print the filename for each match.
したがって、スクリプトを呼び出すのではなく、次のようにします。
grep -H PATTERN [FILE...]
また、ラッパースクリプトを作成する前に、使用しているツールのマニュアルページを確認することをお勧めします。一般的なUnixツールを使用すると、必要な単純なオプションはほとんど常にツールに組み込まれています。
答え2
ついに問題がスイッチgrep
にあることがわかりました-r
stdinを無視して現在の作業ディレクトリから検索。 stdinで強制的に読むには、以下を追加しました-
。
filecat "$ARG" | grep $GREP_ARGS - | sed "s#^#$ARG: #"