Iterar sobre varios archivos en una carpeta y asignar valor

Iterar sobre varios archivos en una carpeta y asignar valor

Tengo una carpeta llamada MyPropertiesy contiene varios .propertiesarchivos como 1.properties, etc. Cada archivo contiene algo como:2.properties3.properties

keyname=value 

¿Qué debo escribir aquí como valor en el archivo de propiedades para que se asigne o reemplace? ¿Cómo repito estos en un script bash y asigno el valor a la clave?

Pseudocódigo:

#!/bin/bash
valuetobepassed="something"
#iterate over each file in the folder and replace/assign value corresponding to keyname

Respuesta1

Puede utilizar sedpara reemplazar valores en archivos:

#!/bin/bash

new_value=5
for f_name in MyProperties/*.properties; do
     sed -i "s/^keyname=.*$/keyname=$new_value/" "$f_name"
done

Respuesta2

Si realmente tiene varios archivos con varName=valuepares, entonces todo lo que necesita hacer esfuenteél. Entonces, itere sobre todos .propertieslos archivos y obtenga cada uno de ellos:

for file in /path/to/MyProperties/*.properties; do
    . "$file"
done

Ahora tiene todas sus variables definidas en su script. Para ilustrar:

$ cat foo.properties 
foo="bar"
$ echo "$foo"  ## no value

$ . ./foo.properties 
$ echo "$foo"
bar

Esto supone que sus .propertiesarchivos tienennada más que pares variable=valor. Al realizar el abastecimiento, cada línea del archivo se ejecutará en el shell que ejecuta el script que realiza el abastecimiento. Por lo tanto, .propertiestambién se ejecutarán todos los comandos de sus archivos. Y cualquier atacante con acceso MyPropertiespuede agregar un comando malicioso allí. Así que sólo haga esto si puede estar seguro del contenido de los archivos.

Tenga en cuenta que es importante que la ruta proporcionada al .archivo integrado contenga un /carácter (de ahí lo ./foo.propertiesanterior), ya que de lo contrario el archivo se busca en los directorios de $PATHen lugar del directorio actual (en el caso de bashque no esté en el modo de cumplimiento POSIX, . filese busca fileen el directorio de trabajo actual si no se ha encontrado en $PATH).

información relacionada