Eu tentei diferentes variações do seguinte, mas nada parece funcionar. Basicamente, quando find
é executado, nada parece acontecer. Abaixo apresento meu código de função bash e minha saída quando o executo.
Estou interessado em entender o que acontece com o código abaixo e por que ele não se comporta como quando digito o comando explicitamente.
Também me disseram que não terei acesso a rgrep
algumas caixas nas quais estarei trabalhando e, portanto, tento esta abordagem para uma solução genérica para obter código, etc.
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]}
}
E a saída é:
$ 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'
Responder1
O padrão que você provavelmente pretendia usar era *.txt
, mas você está dizendo find -name
para usar '*.txt'
, incluindo as aspas simples, que não correspondem a nenhum arquivo. A expansão funciona da seguinte forma:
Na linha de comando, quando você digita
$ find -name '*.txt'
seu shell vê '*.txt'
que está entre aspas, então ele remove as aspas e passa o conteúdo, *.txt
, para find
.
Na função,
find -name "'$var'"
o shell se expande $var
para *.txt
. Como a expansão ocorreu entre aspas duplas, o shell remove as aspas duplas e passa o conteúdo, '*.txt'
, para find
.
A solução é simples: remova as aspas simples do arquivo find -name "'$var'"
.
Retoquei sua função para você:
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 "$@"
}