以下のさまざまなバリエーションを試してみましたが、何も機能しないようです。基本的に、がfind
実行されても何も起こらないようです。以下に、bash 関数コードとそれを実行したときの出力を示します。
以下のコードで何が起こるのか、また、コマンドを明示的に入力したときと同じように動作しないのはなぜなのかを理解したいと思っています。
rgrep
また、作業中の一部のボックスにアクセスできないと言われました。そのため、コードなどを grep で検索するための一般的なソリューションとしてこのアプローチを試しました。
function findin() {
if [ -z $1 ] ; then
echo "Usage: findin <file pattern> <<grep arguments>>"
return 1
fi
fIn[1]=$1
shift
fIn[2]="$@"
echo -- "${fIn[1]}"
echo -- "'${fIn[2]}'"
find -type f -name "'${fIn[1]}'" -print0 | xargs -0 grep --color=auto ${fIn[2]}
}
出力は次のようになります。
$ ls
Server.tcl Server.tcl~ test.cfg vimLearning.txt
$ find -type f -name '*.txt' -print0 | xargs -0 grep --color=auto char
x deletes char under cursor. NNx deletes NN chars to RHS of cursor.
r type r and the next char you type will replace the char under the cursor.
$ findin '*.txt' char
-- *.txt
-- 'char'
答え1
おそらく使用しようとしていたパターンは ですが、一重引用符を含むを使用するように*.txt
指示しているため、どのファイルにも一致しません。展開は次のように機能します。find -name
'*.txt'
コマンドラインと入力すると
$ find -name '*.txt'
シェルは が'*.txt'
引用符で囲まれていると判断し、引用符を削除して、内容*.txt
を に渡しますfind
。
関数内で、
find -name "'$var'"
シェル$var
は に展開します*.txt
。展開は二重引用符内で行われたため、シェルは二重引用符を削除し、内容'*.txt'
を に渡しますfind
。
解決策は簡単です。 内の一重引用符を削除しますfind -name "'$var'"
。
あなたの機能を修正しました:
findin () {
if (( $# < 2 )); then
>&2 echo "Usage: findin <file pattern> <grep arguments ...>"
return 1
fi
pattern=$1
shift
printf '%s\n' "-- ${pattern}"
printf '%s ' "-- $@"
echo
find -type f -name "${pattern}" -print0 |
xargs -0 grep --color=auto "$@"
}