.zshrcには次のように定義された関数があります。
fdtnxg () {
find $1 -type $2 -name "$3" | xargs grep "${@:4}"
}
現在のディレクトリの名前がfdtnxg
。alias mot
tt.
fdtnxg . f "tt.*" "alias mot"
fdtnxg . f tt.* alias mot
自分で使いたいのに使えません。期待どおりに動作させる方法はありますか?
私が変えようとしているのはfdtnxg
次のとおりです。
fdtnxg () {
find $1 -type $2 -name "\"$3\"" | xargs grep "${@:4}"
}
echo "\"123\""
見積もりを受けたのでこれを試しました"123"
。
答え1
ここに2つの質問があると思います。
まず、関数を実行するときにシェルがワイルドカードを使用しないようにします。実行前にファイル名が関数の引数に拡張されるため、関数の内部に引用符を追加してこれを行うことはできません。ファイル名の拡張を防ぐには、alias()を使用して自動化できるnoglob fdtnxg
この関数を実行してくださいalias fdtnxg="noglob fdtnxg"
。
2. Grepパラメータ。 4番目から始まる関数引数をgrepの単一の文字列に連結したいとします。"${@:4}"
、別の単語に展開します("$@"
すべての位置パラメータと同様)。"$*"
代わりに、パラメータを単一の文字列に連結してください。 Zshでは、"${*[4,-1]}"
4番目以降のパラメータを連結することが可能です。 ("${*:4}"
すべて接続して4番目から始めてください。特徴、これはBashが行うのとは異なります。 )それでもうまくいかない場合は、いつでも最初の3つを外に移動して使用できます"$*"
。
だからどちらにしても
fdtnxg () {
find "$1" -type "$2" -name "$3" -exec \
grep -- "${*[4,-1]}" /dev/null {} +
}
または
fdtnxg () {
local dir=$1
local type=$2
local name=$3
shift 3
find "$dir" -type "$type" -name "$name" -exec \
grep -- "$*" /dev/null {} +
}
そして
alias fdtnxg="noglob fdtnxg"
find
とにかく、出力をそのようにパイプに接続することはできませんxargs
。-print0
/ GNU拡張子が必要です-0
。または、ここでは標準の-exec cmd {} +
検索構文を使用することをお勧めします(ファイルが1つしか見つからない場合でも、ファイル名が常に印刷されるようにパラメータを追加します。GNU/dev/null
ではそのオプションも使用できます)。grep
find
grep
-H