私は再帰サポートを追加しようとしていますfilegrep スクリプト。
何らかの理由で、これは期待どおりに動作しません。
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を無視し、代わりに現在の作業ディレクトリを検索します標準入力の読み取りを強制するために、以下を追加しました-
:
filecat "$ARG" | grep $GREP_ARGS - | sed "s#^#$ARG: #"