このような機能を使用しています。
$ find-grep () { find . -type f -name "$1" -print0 | xargs -0 grep "$2" ; }
入力後:
$ find-grep *.c foo
最後のコマンド文字列を拡張したいと思います。この場合:
find . -type f -name "*.c" -print0 | xargs -0 grep "foo"
簡単にできる方法はありますか?
ベストアンサー1
@slmのより健全なバージョン:
find-grep() {
cmd=(find . -type f -name "$1" -exec grep "$2" {})
printf '%q ' "${cmd[@]}"
printf '+\n'
"${cmd[@]}" +
}
(パイプやxargs
ここでは必要ありません)または:
find-grep () (
set -x
find . -type f -name "$1" -exec grep "$2" {} +
)
(範囲を制限するためにサブシェルを起動する()
のではなく、注意してください。より多くのプロセスが分岐せず、実行されるプロセスがより早く完了することに注意してください。){}
set -x
fork
find
シェルがワイルドカード文字を拡張しないようにワイルドカード文字を引用する必要があることに注意してください。
find-grep '*.c' pattern
Up代わりに、キーを押したときに拡張コマンドが表示されるように履歴にプッシュするには、次のように書くことができます。
find-grep() {
cmd=$(printf '%q ' find . -type f -name "$1" -exec grep "$2" {})+
history -s "$cmd"
eval "$cmd"
}