
Estoy intentando recorrer archivos en un directorio que comienza con la cadena indicada en la for
declaración. Dentro del bucle, quiero buscar la cadena del patrón foo
dentro del archivo. Si la cadena se encuentra en el archivo que echo
quiero $filename
.
#!/ppp/bash
for filename in $(find ~/filesList -type f -name "pge_*")
do
#If 'foo' located echo $filename
done
Cualquier sugerencia sería muy apreciada.
Respuesta1
Utilice find
para ejecutar grep
:
find ~/filesList -type f -name 'pge_*' -exec grep -lF -- foo {} +
-l
enumera los nombres de los archivos que contienen una coincidencia para foo
. -F
significa que la expresión foo
debe tomarse como una cadena fija en lugar de una expresión regular.
Respuesta2
Primera sugerencia: no es necesario usarlo find
en su for
bucle, ralentiza las cosas. En su lugar, puedes hacer algo como:
for f in ~/filesList/pge_*
Una advertencia bastante importante es que esta versión simplificada no buscará subdirectorios ~/filesList
mientras que la find
versión sí lo hará, por lo que, dependiendo de su caso de uso real, es posible que no pueda simplificar.
En cuanto a la búsqueda dentro de esos archivos, querrás utilizar un grep
tipo de construcción:
if (grep needle haystack > /dev/null 2>&1)
then
echo $f
fi
Cuando grep
encuentra la aguja que está buscando, devuelve un valor distinto de cero, por lo que la condición se evalúa como VERDADERA. Utilizo el > /dev/null 2>&1
para evitar ver los resultados del grep
. Si grep
no encuentra la aguja en el pajar, su código de retorno es 0, por lo tanto el condicional es FALSO, omitiendo la then
declaración.