He probado diferentes variaciones de lo siguiente pero nada parece funcionar. Básicamente, cuando find
se ejecuta, parece que no sucede nada. A continuación presento el código de mi función bash y mi resultado cuando lo ejecuto.
Estoy interesado en entender qué sucede con el código siguiente y por qué no se comporta como cuando escribo el comando explícitamente.
También me dijeron que no tendré acceso a rgrep
algunos cuadros en los que estaré trabajando y, por lo tanto, pruebo este enfoque para obtener una solución genérica para buscar 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]}
}
Y la salida es:
$ 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'
Respuesta1
El patrón que probablemente pretendías usar era *.txt
, pero estás indicando find -name
que lo uses '*.txt'
, incluidas las comillas simples, que no coinciden con ningún archivo. La ampliación funciona de la siguiente manera:
En la línea de comando, cuando escribes
$ find -name '*.txt'
su shell ve '*.txt'
que está entrecomillado, por lo que elimina las comillas y pasa el contenido, *.txt
a find
.
en la funcion,
find -name "'$var'"
el caparazón se expande $var
a *.txt
. Dado que la expansión se produjo entre comillas dobles, el shell elimina las comillas dobles y pasa el contenido, '*.txt'
a find
.
La solución es simple: elimine las comillas simples en find -name "'$var'"
.
Te retoqué tu función:
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 "$@"
}