Linux/Unix Shell Scripting - Problema con comillas en find

   
Vista:

Problema con comillas en find

Publicado por Bodegas (5 intervenciones) el 17/09/2009 09:21:09
Normalmente cuando quiero buscar algo que no sé ni en que directorio está, lo que hago es:
find / -xdev -name '*palabra*'

(El xdev es para que no busque en particiones de windows)

Pues hoy me he quitado la pereza y he intentado hacer un simple script para no tener que escribir siempre lo mismo.
Lo que quiero es un script llamado buscar.sh al que le paso un parámetro y me realiza la búsqueda que he puesto antes.

Sería algo así:

#!/bin/bash

#Realiza esta búsqueda: find / -xdev -name '*palabra*'
IFS='
';

if [ $# -ne 0 ];
then
find / -xdev -name '*$1*'
fi

Ves por donde voy, no?
Vale, pues esto no funciona y el problema es casi seguro las comillas.
He intentado combinaciones hasta el infinito:

`find / -xdev -name '*$1*'`
find / -xdev -name "'*$1*'"
find / -xdev -name ''*$1*''

Incluso escapando las comillas y los astericos, no funciona

find / -xdev -name \'\*$1\*\'

Alguna idea?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problema con comillas en find

Publicado por Linusero (3 intervenciones) el 17/09/2009 10:19:55
Ok. El problema lo tienes en los asteriscos y el $1, que no se pueden mezclar bien. Has de separarlos. Prueba esto:

BUSCAR="*"$1"*"
find / -xdev -name $BUSCAR

Y si lo ejecutas como buscar.sh "bash", te sale:

/bin/bash
find: /etc/racoon/certs: Permiso denegado
find: /etc/cron.d: Permiso denegado
/etc/skel/.bash_profile
/etc/skel/.bashrc
/etc/skel/.bash_logout
find: /etc/selinux/targeted/modules/previous: Permiso denegado
find: /etc/selinux/targeted/modules/active: Permiso denegado
find: /etc/pki/CA: Permiso denegado
find: /etc/cups/ssl: Permiso denegado
find: /etc/lvm/backup: Permiso denegado
find: /etc/lvm/archive: Permiso denegado
/etc/bashrc

.....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con comillas en find

Publicado por Tom (253 intervenciones) el 17/09/2009 10:33:21
Sips, es una solución, pero tiene un problema.
Normalmente se usan comillas con find para evitar que el shell expanda la expresión antes de que lo pueda hacer el find.

Me explico con un ejemplo:

$ ls
musica videos pruebas
workspace workspace.test documentos
$
$ find / -name work*
find: paths must precede expression: workspace.test
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
$

O sea, que si hay algún fichero que coincida con la máscara que le pasas a find en el directorio en que lo estás ejecutando, el shell va a expandir esa máscara para convertirla en una (posible) lista de ficheros pasándosela como parámetro a find y haciendo que éste ofrezca resultados incorrectos (o de un error, directamente).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con comillas en find

Publicado por Bodegas (5 intervenciones) el 17/09/2009 11:00:55
Efectivamente, tiene razón Tom.
Es necesario usar comillas simples con find para que los asteriscos no es expandan si se da la casualidad de que en el directorio actual haya algún fichero con parte del nombre igual a la cadena que estás buscando.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con comillas en find

Publicado por Tom (253 intervenciones) el 17/09/2009 10:22:26
Necesitas repasar (o aprender) algunos conceptos _básicos_ de shell (de bash en este caso):

http://www.hypexr.org/bash_tutorial.php

Presta atención a la diferencia entre usar comilla simple y comilla doble.

Si no quieres aprender más, te diré que entre comillas simples las variables _no_ se sustituyen por su valor, así que '$1' es simplemente '$1'.

BUSCAR=$1

find / -name "*${BUSCAR}*"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con comillas en find

Publicado por Bodegas (5 intervenciones) el 17/09/2009 11:43:46
Hola Tom, gracias por contestar.

La verdad es que no lo he hecho a las buenas de Dios, sino que he mirado manuales en los que explican el funcionamiento de los tres tipos de comillas, pero incluso así se me ha resistido, por eso he hecho la pregunta aquí :D

Vamos por partes.

find / -xdev -name '*$1*'
Entiendo que esta expresión no funcione porque todo lo que vaya dentro de comillas simples se convierte en texto.

`find / -xdev -name '*$1*'`
Con esta tendríamos el mismo problema.

find / -xdev -name "'*$1*'"
Con esta el problema sería el siguiente.
Dentro de las comillas dobles los símbolos $ y ' siguen manteniendo su significado especial y por lo tanto al estar la expresión encerrada entre comillas simples, seguiría siendo texto.

find / -xdev -name ''*$1*''
Con esta expresión el problema es que no hai comillas simples y por lo tanto tendríamos problemas a la hora de buscar ficheros con find. Tal y como explicábamos en el otro post.
Además yo creo que esta expresión es exactamente igual a la que tú as propuesto:
BUSCAR=$1
find / -name "*${BUSCAR}*"

find / -xdev -name \'\*$1\*\'
Esta es mi gran duda. Debería funcionar ya que $1 se sustituye por su valor.
Las comillas están escapadas y por lo tanto no afectan a la variable.
Los asteriscos también están escapados y tendrían que dar problemas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con comillas en find

Publicado por Tom (253 intervenciones) el 17/09/2009 12:51:25
Creo que en el último caso que planteas, te sobrarían las comillas. El shell no trataría de expandir los '*' así que find recibiría la cadena *$1* y tampoco le veo mucha utilidad a escapar las comillas. Creo que debería funcionar:

-name \\*$1\\*

Pero esto no te serviría para buscar nombres de ficheros con espacios.

Lo de asignar $1 a una variable intermedia es por sana costumbre, para después poder usar "lo_que_sea${VARIABLE}lo_que_sea" y delimitar sin posiblidad de error el nombre de la variable a sustituir. Peeero, parece que en bash podrías usar ${1} -lógico, porque también permite más de 9 parámetros posicionales, sin shift no como antes- y te ahorrarías la variable intermedia (pruébalo).

Resumiendo, yo usaría siempre:

-name "*${1}*"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con comillas en find

Publicado por Bodegas (5 intervenciones) el 17/09/2009 19:05:23
He hecho pruebas, y funciona lo que dices pero lo peor es que no lo entiendo :?

he creado un archivo en el directorio actual llamado pruebaA
luego he ejecutado find / -name *prueba*
y el resultado ha sido /home/nick/pruebaA
la explicación es que los asteriscos se han expandido y find ha buscado pruebaA.
Esto es lógico y lo entiendo.

Lo que no entiendo es que en el script he hecho esto:
find / -name \*${1}\*
he ejecutado buscar.sh prueba
y el resultado ha sido todos los archivos que contienen la palabra prueba, que tengo en la partición. Es decir, lo que tiene que hacer.
Lo que no entiendo es por que no ha expandido los asteriscos :?¿

También he probado en el script
find / -name "*${1}*"
he ejecutado buscar.sh prueba
y el resultado es correcto.
Tampoco lo entiendo.
Aquí las comillas dobles, lo único que hacen es sustituir la variable ${1} por su valor y luego lo que se ejecuta en bash es esto:
find / -name *prueba*
por lo tanto tendría que fallar y devolver como resultado y el resultado ha sido /home/nick/pruebaA
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar